DHC Working Group                                                 Y. Cui
Internet-Draft                                                   H. Wang                                                    L. Sun
Intended status: Standards Track                                  L. Sun
Expires: May 1, 2018                     Tsinghua University
Expires: June 26, 2018                                         I. Farrer
                                                              S. Zechlin
                                                     Deutsche Telekom AG
                                                        October 28,
                                                                   Z. He
                                                     Tsinghua University
                                                       December 23, 2017

                YANG Data Model for DHCPv6 Configuration
                     draft-ietf-dhc-dhcpv6-yang-04
                     draft-ietf-dhc-dhcpv6-yang-05

Abstract

   This document describes a YANG data model [RFC6020] for the
   configuration and management of DHCPv6 servers, relays, and clients.

Requirements Language

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
   document are to be interpreted as described in [RFC2119].

Status of This Memo

   This Internet-Draft is submitted in full conformance with the
   provisions of BCP 78 and BCP 79.

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF).  Note that other groups may also distribute
   working documents as Internet-Drafts.  The list of current Internet-
   Drafts is at https://datatracker.ietf.org/drafts/current/.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   This Internet-Draft will expire on May 1, June 26, 2018.

Copyright Notice

   Copyright (c) 2017 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents
   (https://trustee.ietf.org/license-info) in effect on the date of
   publication of this document.  Please review these documents
   carefully, as they describe your rights and restrictions with respect
   to this document.  Code Components extracted from this document must
   include Simplified BSD License text as described in Section 4.e of
   the Trust Legal Provisions and are provided without warranty as
   described in the Simplified BSD License.

Table of Contents

   1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   2
     1.1.  Terminology . . . . . . . . . . . . . . . . . . . . . . .   3
   2.  DHCPv6 Tree Diagram . . . . . . . . . . . . . . . . . . . . .   3
     2.1.  DHCPv6 Server Tree Diagrams . . . . . . . . . . . . . . .   3
     2.2.  DHCPv6 Relay Tree Diagrams  . . . . . . . . . . . . . . .  14  16
     2.3.  DHCPv6 Client Tree Diagrams . . . . . . . . . . . . . . .  17
     2.4.  Notifications Mechanism for  20
   3.  DHCPv6 YANG Model . . . . . . . . . . .  22
   3. . . . . . . . . . . .  27
     3.1.  DHCPv6 Server YANG Model  . . . . . . . . . . . . . . . .  27
     3.2.  DHCPv6 Relay YANG Model . . . . . . . . . . . . . . . . .  48
     3.3.  DHCPv6 Client YANG Model  . . . . . . . . . . . . . . . .  58
     3.4.  DHCPv6 Options YANG Model . . . . . . . . . .  24 . . . . . .  67
   4.  Security Considerations (TBD) . . . . . . . . . . . . . . . .  91  98
   5.  IANA Considerations (TBD) . . . . . . . . . . . . . . . . . .  91  98
   6.  Acknowledgements  . . . . . . . . . . . . . . . . . . . . . .  91  98
   7.  Contributors  . . . . . . . . . . . . . . . . . . . . . . . .  98
   8.  References  . . . . . . . . . . . . . . . . . . . . . . . . .  91
     7.1.  98
     8.1.  Normative References  . . . . . . . . . . . . . . . . . .  91
     7.2.  98
     8.2.  Informative References  . . . . . . . . . . . . . . . . .  92  99
   Authors' Addresses  . . . . . . . . . . . . . . . . . . . . . . .  94 101

1.  Introduction

   DHCPv6 [RFC3315] is widely used for supplying configuration and other
   relevant parameters to clients in IPv6 networks.  This document
   defines a DHCPv6 YANG data model, containing sub-modules for the
   configuration and management of DHCPv6 servers, relays and clients.
   A single YANG model covering all of these elements provides an
   operator with a common interface for the management of the entire
   DHCPv6 deployment in their network.

   Since the publication of the original DHCPv6 specification, there
   have been a large number of addional documents that update the
   protocol's operation, add new functions and define new options.  The
   YANG model described in this document incorporates all relevent
   changes.  A full list of the documents which have been considedered
   in the development of this model is included in Appendix A.

   IF - Commment - Does anyone have this list?

   It is worth noting that as DHCPv6 is itself a device configuration
   protocol, it is not the intention of this document to replace the
   configuration of DHCPv6 options and parameters using the DHCPv6
   protocol with the configuration of DHCPv6 options using NETCONF/YANG.
   The DHCPv6 client model is intended for the configuration of the
   DHCPv6 client function and also for obtaining read-only state data
   from the client which has been learnt via the normal DHCPv6 message
   flow.  This gives an operator a better method for managing DHCPv6
   clients and simplifies troubleshooting.

1.1.  Terminology

   The reader should be familiar with the terms defined in DHCPv6
   [RFC3315] and other relevant documents.

   The DHCPv6 tree diagrams provide a concise representation of a YANG
   module to help the reader understand the module structure.

   A simplified graphical representation of the data model is provided
   in this d cument.  For a description of the symbols in these
   diagrams, please refer to [I-D.ietf-netmod-yang-tree-diagrams].

2.  DHCPv6 Tree Diagram

2.1.  DHCPv6 Server Tree Diagrams

module: ietf-dhcpv6 ietf-dhcpv6-server
+--rw server!
 +--rw server-config
 |  +--rw serv-attributes
 |  |  +--rw name?                string
 |  |  +--rw duid
 |  |  |  +--rw type-code?                   uint16
 |  |  |  +--rw (duid-type)?
 |  |  |     +--:(duid-llt)
 |  |  |     |  +--rw duid-llt-hardware-type?      uint16
 |  |  |     |  +--rw duid-llt-time?               yang:timeticks
 |  |  |     |  +--rw duid-llt-link-layer-addr?    yang:mac-address
 |  |  |     +--:(duid-en)
 |  |  |     |  +--rw duid-en-enterprise-number?   uint32
 |  |  |     |  +--rw duid-en-identifier?          string
 |  |  |     +--:(duid-ll)
 |  |  |     |  +--rw duid-ll-hardware-type?       uint16
 |  |  |     |  +--rw duid-ll-time?                yang:timeticks duid-ll-link-layer-addr?     yang:mac-address
 |  |  |     +--:(duid-uuid)
 |  |  |     |  +--rw uuid?                        yang:uuid
 |  |  |     +--:(duid-invalid)
 |  |  |        +--rw data?                        binary
 |  |  +--rw ipv6-address*        inet:ipv6-address
 |  |  +--rw description?         string
 |  |  +--rw pd-function          boolean
 |  |  +--rw stateless-service    boolean
 |  |  +--rw rapid-commit         boolean
 |  |  +--rw interfaces-config*   string
 |  |  +--rw vendor-info
 |  |     +--rw ent-num    uint32
 |  |     +--rw data*      string
 |  +--rw option-sets
 |  |  +--rw option-set* [option-set-id] [id]
 |     +--rw option-set-id                   uint8  |   +--rw new-or-standard-option* [option-code] id                                    uint32
 |  |   +--rw option-code           uint16 server-unicast-option! {server-unicast-op}?
 |  |  +--rw option-name           string
       |   |  +--rw option-description    string server-address?   inet:ipv6-address
 |  |   +--rw option-reference?     string sip-server-domain-name-list-option!
                            {sip-server-domain-name-list-op}?
 |  |  +--rw option-value          string   |  +--rw user-class-value? sip-serv-domain-name    string
 |     +--rw enterprise-number?              uint32
       |     +--rw store-client-link-layer?        boolean
       |     +--rw preference-option
       |     |  +--rw enable              boolean
       |  |   +--rw preference-value    uint8
       |     +--rw sip-server-option
       | sip-server-address-list-option! {sip-server-address-list-op}?
 |  +--rw enable        boolean  |   |  +--rw sip-server* [sip-serv-id]
 |  |   |     +--rw sip-serv-id      uint8
 |  |     +--rw sip-serv-domain-name    string
       |   |     +--rw sip-serv-addr    inet:ipv6-address
 |     +--rw dns-config-option
       |  |   +--rw enable        boolean dns-config-option! {dns-config-op}?
 |  |   |  +--rw dns-server* [dns-serv-id]
 |  |   |     +--rw dns-serv-id      uint8
 |  |   |     +--rw dns-serv-addr    inet:ipv6-address
 |     +--rw domain-searchlist-option
       |  |   +--rw enable               boolean domain-searchlist-option! {domain-searchlist-op}?
 |  |   |  +--rw domain-searchlist* [domain-searchlist-id]
 |  |   |     +--rw domain-searchlist-id        uint8
 |  |   |     +--rw domain-search-list-entry    string
 |     +--rw nis-config-option
       |  |   +--rw enable        boolean nis-config-option! {nis-config-op}?
 |  |   |  +--rw nis-server* [nis-serv-id]
 |  |   |     +--rw nis-serv-id      uint8
 |  |   |     +--rw nis-serv-addr    inet:ipv6-address
 |     +--rw nis-plus-config-option
       |  |   +--rw enable             boolean nis-plus-config-option! {nis-plus-config-op}?
 |  |   |  +--rw nis-plus-server* [nis-plus-serv-id]
 |  |   |     +--rw nis-plus-serv-id      uint8
 |  |   |     +--rw nis-plus-serv-addr    inet:ipv6-address
 |  |   +--rw sntp-server-option nis-domain-name-option! {nis-domain-name-op}?
 |  |   |  +--rw enable         boolean nis-domain-name?   string
 |  |   +--rw sntp-server* nis-plus-domain-name-option!{nis-plus-domain-name-op}?
 |  |   |  +--rw nis-plus-domain-name?   string
 |  |   +--rw sntp-server-option! {sntp-server-op}?
 |  |   |  +--rw sntp-server* [sntp-serv-id]
 |  |   |     +--rw sntp-serv-id      uint8
 |  |   |     +--rw sntp-serv-addr    inet:ipv6-address
 |     +--rw info-refresh-time-option
       |  |   +--rw enable               boolean info-refresh-time-option! {info-refresh-time-op}?
 |  |   |  +--rw info-refresh-time    yang:timeticks
 |     +--rw cli-fqdn-option
       |  |   +--rw enable                    boolean client-fqdn-option! {client-fqdn-op}?
 |  |   |  +--rw server-initiate-update    boolean
 |  |   |  +--rw client-initiate-update    boolean
 |  |   |  +--rw modify-name-from-cli      boolean
 |     +--rw posix-timezone-option
       |  |   +--rw enable      boolean posix-timezone-option! {posix-timezone-op}?
 |  |   |  +--rw tz-posix    string
 |     +--rw posix-timezone-db-option
       |  |   +--rw enable         boolean tzdb-timezone-option! {tzdb-timezone-op}?
 |  |   |  +--rw tz-database    string
 |     +--rw ntp-server-option
       |  |   +--rw enable        boolean ntp-server-option! {ntp-server-op}?
 |  |   |  +--rw ntp-server* [ntp-serv-id]
 |  |   |     +--rw ntp-serv-id                    uint8
 |  |   |     +--rw ntp-serv-addr-suboption        inet:ipv6-address (ntp-time-source-suboption)?
 |  |   |        +--:(server-address)
 |  |   |        |  +--rw ntp-serv-mul-addr-suboption ntp-serv-addr-suboption* inet:ipv6-address
 |  |   |        +--:(server-multicast-address)
 |  |   |        |  +--rw ntp-serv-fqdn-suboption        string ntp-serv-mul-addr-suboption* inet:ipv6-address
 |  |   |        +--:(server-fqdn)
 |  |   |           +--rw network-boot-option ntp-serv-fqdn-suboption*       string
 |  |   +--rw enable       boolean boot-file-url-option! {boot-file-url-op}?
 |  |   |  +--rw boot-file* [boot-file-id]
 |  |   |     +--rw boot-file-id          uint8
 |  |   |     +--rw suitable-arch-type*   uint16
 |  |   |     +--rw suitable-net-if*      uint32
 |  |   |     +--rw boot-file-url         string
 |  |   +--rw boot-file-param-option! {boot-file-param-op}?
 |  |   |  +--rw boot-file-paras* [para-id]
 |  |   |     +--rw para-id      uint8
 |  |   |     +--rw parameter    string
 |     +--rw aftr-name-option
       |  |   +--rw enable                  boolean aftr-name-option! {aftr-name-op}?
 |  |   |  +--rw tunnel-endpoint-name    string
 |     +--rw kerberos-option
       |  |   +--rw enable                boolean kbr-default-name-option! {kbr-default-name-op}?
 |  |   |  +--rw default-realm-name    string
 |  |   +--rw kbr-kdc-option! {kbr-kdc-op}?
 |  |   |  +--rw kdc-info* [kdc-id]
 |  |   |     +--rw kdc-id            uint8
 |  |   |     +--rw priority          uint16
 |  |   |     +--rw weight            uint16
 |  |   |     +--rw transport-type    uint8
 |  |   |     +--rw port-number       uint16
 |  |   |     +--rw kdc-ipv6-addr     inet:ipv6-address
 |  |   |     +--rw realm-name        string
 |  |   +--rw addr-selection-option sol-max-rt-option! {sol-max-rt-op}?
 |  |   |  +--rw enable          boolean sol-max-rt-value    yang:timeticks
 |  |   +--rw inf-max-rt-option! {inf-max-rt-op}?
 |  |   |  +--rw inf-max-rt-value    yang:timeticks
 |  |   +--rw addr-selection-option! {addr-selection-op}?
 |  |   |  +--rw a-bit-set       boolean
 |  |   |  +--rw p-bit-set       boolean
 |  |   |  +--rw policy-table* [policy-id]
 |  |   |     +--rw policy-id     uint8
 |  |   |     +--rw label         uint8
 |  |   |     +--rw precedence    uint8
 |  |   |     +--rw prefix-len    uint8
 |  |   |     +--rw prefix        inet:ipv6-prefix
 |     +--rw sol-max-rt-option
       |     |  +--rw enable              boolean
       |     |  +--rw sol-max-rt-value    yang:timeticks
       |     +--rw inf-max-rt-option
       |     |  +--rw enable              boolean
       |     |  +--rw inf-max-rt-value    yang:timeticks  |   +--rw pcp-server-option pcp-server-option! {pcp-server-op}?
 |  |  +--rw enable        boolean
       |   |  +--rw pcp-server* [pcp-serv-id]
 |  |   |     +--rw pcp-serv-id      uint8
 |  |   |     +--rw pcp-serv-addr    inet:ipv6-address
 |     +--rw s46-rule-option
       |  |   +--rw enable      boolean s46-rule-option! {s46-rule-op}?
 |  |   |  +--rw s46-rule* [rule-id]
 |  |   |     +--rw rule-id           uint8
 |  |   |     +--rw rule-type         enumeration
 |  |   |     +--rw prefix4-len       uint8
 |  |   |     +--rw ipv4-prefix       inet:ipv4-prefix
 |  |   |     +--rw prefix6-len       uint8
 |  |   |     +--rw ipv6-prefix       inet:ipv6-prefix
 |  |   |     +--rw port-parameter
 |  |   |        +--rw offset      uint8
 |  |   |        +--rw psid-len    uint8
 |  |   |        +--rw psid        uint16
 |     +--rw s46-br-option
       |  |   +--rw enable    boolean s46-br-option! {s46-br-op}?
 |  |   |  +--rw br* [br-id]
 |  |   |     +--rw br-id           uint8
 |  |   |     +--rw br-ipv6-addr    inet:ipv6-address
 |  |   +--rw operator-option-ipv6-address s46-dmr-option! {s46-dmr-op}?
 |  |   |  +--rw enable                boolean dmr* [dmr-id]
 |  |   |     +--rw operator-ipv6-addr* [operator-ipv6-addr-id] dmr-id             uint8
 |  |   |     +--rw operator-ipv6-addr-id dmr-prefix-len     uint8
 |  |     +--rw operator-ipv6-addr       inet:ipv6-address   |     +--rw operator-option-single-flag dmr-ipv6-prefix    inet:ipv6-prefix
 |  |   +--rw enable    boolean s46-v4-v6-binding-option! {s46-v4-v6-binding-op}?
 |  |   |  +--rw flag* [flag-id] ce* [ce-id]
 |  |   |     +--rw flag-id ce-id               uint8
 |  |     +--rw flag-value    boolean   |     +--rw operator-option-ipv6-prefix ipv4-addr           inet:ipv4-address
 |  |   |     +--rw enable                  boolean bind-prefix6-len    uint8
 |  |   |     +--rw operator-ipv6-prefix* [operator-ipv6-prefix-id] bind-ipv6-prefix    inet:ipv6-prefix
 |  |   |     +--rw operator-ipv6-prefix-id      uint8 port-parameter
 |  |   |        +--rw operator-ipv6-prefix6-len offset      uint8
 |  |     +--rw operator-ipv6-prefix         inet:ipv6-prefix   |        +--rw operator-option-int32 psid-len    uint8
 |  |   |        +--rw enable      boolean psid        uint16
 |  |   +--rw int32val* [int32val-id] operator-option-ipv6-address!{operator-op-ipv6-address}?
 |  |   |  +--rw int32val-id    uint8 operator-ipv6-addr* [operator-ipv6-addr-id]
 |  |   |     +--rw int32val       uint32 operator-ipv6-addr-id    uint8
 |  |   |     +--rw operator-option-int16 operator-ipv6-addr       inet:ipv6-address
 |  |   +--rw enable      boolean operator-option-single-flag!{operator-op-single-flag}?
 |  |   |  +--rw int16val* [int16val-id] flag* [flag-id]
 |  |   |     +--rw int16val-id flag-id       uint8
 |  |     +--rw int16val       uint16   |     +--rw operator-option-int8 flag-value    boolean
 |  |   +--rw enable     boolean operator-option-ipv6-prefix!{operator-op-ipv6-prefix}?
 |  |   |  +--rw int8val* [int8val-id] operator-ipv6-prefix* [operator-ipv6-prefix-id]
 |  |   |     +--rw int8val-id operator-ipv6-prefix-id      uint8
 |  |   |     +--rw int8val operator-ipv6-prefix6-len    uint8
 |  |   |     +--rw operator-option-uri operator-ipv6-prefix         inet:ipv6-prefix
 |  |   +--rw enable    boolean operator-option-int32! {operator-op-int32}?
 |  |   |  +--rw uri* [uri-id] int32val* [int32val-id]
 |  |   |     +--rw uri-id int32val-id    uint8
 |  |     +--rw uri       string   |     +--rw operator-option-textstring int32val       uint32
 |  |   +--rw enable        boolean operator-option-int16! {operator-op-int16}?
 |  |   |  +--rw textstring* [textstring-id] int16val* [int16val-id]
 |  |   |     +--rw textstring-id int16val-id    uint8
 |  |     +--rw textstring       string   |     +--rw operator-option-var-data int16val       uint16
 |  |   +--rw enable      boolean operator-option-int8! {operator-op-int8}?
 |  |   |  +--rw int32val* [var-data-id] int8val* [int8val-id]
 |  |   |     +--rw var-data-id int8val-id    uint8
 |  |     +--rw var-data       binary   |     +--rw operator-option-dns-wire int8val       uint8
 |  |   +--rw enable                      boolean operator-option-uri! {operator-op-uri}?
 |  |  +--rw operator-option-dns-wire*   |  +--rw uri* [uri-id]
 |          [operator-option-dns-wire-id]  |   |     +--rw operator-option-dns-wire-id uri-id    uint8
 |  |     +--rw operator-option-dns-wire       binary   |     +--rw s46-dmr-option uri       string
 |  |   +--rw enable    boolean operator-option-textstring! {operator-op-textstring}?
 |  |   |  +--rw dmr* [dmr-id] textstring* [textstring-id]
 |  |   |     +--rw dmr-id textstring-id    uint8
 |  |   |     +--rw dmr-prefix-len     uint8 textstring       string
 |  |   +--rw dmr-ipv6-prefix    inet:ipv6-prefix operator-option-var-data! {operator-op-var-data}?
 |     +--rw s46-v4-v6-binding-option  |        +--rw enable    boolean   |  +--rw ce* [ce-id] int32val* [var-data-id]
 |           +--rw ce-id               uint8  |           +--rw ipv4-addr           inet:ipv4-address   |     +--rw bind-prefix6-len var-data-id    uint8
 |  |   |     +--rw bind-ipv6-prefix    inet:ipv6-prefix var-data       binary
 |  |   +--rw port-parameter operator-option-dns-wire! {operator-op-dns-wire}?
 |  |      +--rw offset      uint8 operator-option-dns-wire* [operator-option-dns-wire-id]
 |  |         +--rw psid-len operator-option-dns-wire-id    uint8
 |  |         +--rw psid        uint16 operator-option-dns-wire       binary
 |  +--rw network-ranges
 |  +--rw option-set-id?   uint8  |  +--rw network-range* [network-range-id]
 |  |   +--rw network-range-id       uint8       uint32
 |  |   +--rw network-description    string
 |  |   +--rw network-prefix         inet:ipv6-prefix
 |  |   +--rw inherit-option-set     boolean
 |  |   +--rw option-set-id          uint8 option-set-id?
              -> /server/server-config/option-sets/option-set/id
 |  |   +--rw reserved-addresses
 |  |   |  +--rw static-binding* [cli-id]
 |  |   |  |  +--rw cli-id         uint32
 |  |   |  |  +--rw duid
 |  |   |  |  |  +--rw (duid-type)? type-code?                   uint16
 |  |   |  |     +--:(duid-llt)  |  +--rw (duid-type)?
 |  |   |  |  +--rw duid-llt-hardware-type?      uint16  |     +--:(duid-llt)
 |  |   |  |  |     |  +--rw duid-llt-time? duid-llt-hardware-type?      uint16
 |  |   |  |  |     |  +--rw duid-llt-time?      yang:timeticks
 |  |   |  |  |     |  +--rw duid-llt-link-layer-addr?
       |     |  |  |     | yang:mac-address
 |  |   |  |  |     +--:(duid-en)
 |  |   |  |  |     |  +--rw duid-en-enterprise-number?   uint32
 |  |   |  |  |     |  +--rw duid-en-identifier?          string
 |  |   |  |  |     +--:(duid-ll)
 |  |   |  |  |     |  +--rw duid-ll-hardware-type?       uint16
 |  |   |  |  |     |  +--rw duid-ll-time? duid-ll-link-layer-addr? yang:mac-address
 |  |   |  |  |     +--:(duid-uuid)
 |  |   |  |  |                yang:timeticks     |  +--rw uuid?                        yang:uuid
 |  |   |  |  |     +--:(duid-invalid)
 |  |   |  |  |        +--rw data?                        binary
 |  |   |  |  +--rw reserv-addr*   inet:ipv6-address
 |  |   |  +--rw other-reserv-addr*   inet:ipv6-address
 |  |   +--rw reserved-prefixes
 |  |   |  +--rw static-binding* [cli-id]
 |  |   |  |  +--rw cli-id               uint32
 |  |   |  |  +--rw duid
 |  |   |  |  |  +--rw type-code?                   uint16
 |  |   |  |  |  +--rw (duid-type)?
 |  |   |  |  |     +--:(duid-llt)
 |  |   |  |  |     |  +--rw duid-llt-hardware-type?      uint16
 |  |   |  |  |     |  +--rw duid-llt-time?        yang:timeticks
 |  |   |  |  |     |       yang:timeticks
       |     |  |  |     |  +--rw duid-llt-link-layer-addr?
       |     |  |  |     |  yang:mac-address
 |  |   |  |  |     +--:(duid-en)
 |  |   |  |  |     |  +--rw duid-en-enterprise-number?   uint32
 |  |   |  |  |     |  +--rw duid-en-identifier?          string
 |  |   |  |  |     +--:(duid-ll)
 |  |   |  |  |     |  +--rw duid-ll-hardware-type?   uint16
 |  |   |  |  |     |  +--rw duid-ll-time? duid-ll-link-layer-addr? yang:mac-address
 |  |   |  |                yang:timeticks  |     +--:(duid-uuid)
 |  |   |  |  |     |  +--rw uuid?                        yang:uuid
 |  |   |  |  |     +--:(duid-invalid)
 |  |   |  |  |        +--rw data?                        binary
 |  |   |  |  +--rw reserv-prefix-len    uint8
 |  |   |  |  +--rw reserv-prefix        inet:ipv6-prefix
 |  |   |  +--rw exclude-prefix-len     uint8
 |  |   |  +--rw exclude-prefix         inet:ipv6-prefix
 |  |   |  +--rw other-reserv-prefix* [reserv-id]
 |  |   |     +--rw reserv-id     uint8     uint32
 |  |   |     +--rw prefix-len    uint8
 |  |   |     +--rw prefix        inet:ipv6-prefix
 |  |   +--rw address-pools
 |  |   |  +--rw address-pool* [pool-id]
 |  |   |     +--rw pool-id               uint8                          uint32
 |  |   |     +--rw pool-prefix pool-prefi            inet:ipv6-prefix
 |  |   |     +--rw start-address         inet:ipv6-address-no-zone
 |  |   |     +--rw end-address           inet:ipv6-address-no-zone
 |  |   |     +--rw renew-time                       yang:timeticks
 |  |   |     +--rw rebind-time                      yang:timeticks
 |  |   |     +--rw preferred-lifetime               yang:timeticks
 |  |   |     +--rw valid-lifetime                   yang:timeticks
 |  |   |  +--ro total-ipv6-count      uint64
       |     |  |  +--ro used-ipv6-count       uint64
       |     |  |     +--rw utilization-ratio max-address-utilization-ratio    threshold
 |  |   |     +--rw inherit-option-set               boolean
 |  |   |     +--rw option-set-id         uint8
       |     |  +--ro binding-info* [cli-id]
       |     |     +--ro cli-id    uint32
       |     |     +--ro duid
       |     |     |  +--ro (duid-type)?
       |     |     |     +--:(duid-llt)
       |     |     |     |  +--ro duid-llt-hardware-type?      uint16
       |     |     |     |  +--ro duid-llt-time?
       |     |     |     |  |       yang:timeticks
       |     |     |     |  +--ro duid-llt-link-layer-addr?
       |     |     |     |          yang:mac-address
       |     |     |     +--:(duid-en)
       |     |
                 -> /server/server-config/option-sets/option-set/id
 |  |  +--ro duid-en-enterprise-number?   uint32
       |     |     |     |  +--ro duid-en-identifier?          string
       |     |     |     +--:(duid-ll)
       |     |     |        +--ro duid-ll-hardware-type?       uint16
       |     |     |        +--ro duid-ll-time?
       |     |     |                yang:timeticks
       |     |     +--ro cli-ia* [iaid]
       |     |        +--ro ia-type     string
       |     |        +--ro iaid        uint32
       |     |        +--ro cli-addr*   inet:ipv6-address
       |     |        +--ro pool-id     uint8
       |   +--rw prefix-pools
 |  |   |  +--rw prefix-pool* [pool-id]
 |  |   |     +--rw pool-id               uint8                         uint32
 |  |   |     +--rw prefix                          inet:ipv6-prefix
 |  |   |     +--rw prefix-length                   uint8
 |  |   |     +--rw renew-time                      yang:timeticks
 |  |   |     +--rw rebind-time                     yang:timeticks
 |  |   |     +--rw preferred-lifetime              yang:timeticks
 |  |   |     +--rw valid-lifetime                  yang:timeticks
 |  |   |     +--rw utilization-ratio max-prefix-utilization-ratio    threshold
 |  |   |     +--rw inherit-option-set              boolean
 |  |   |     +--rw option-set-id         uint8 option-set-id?
                 -> /server/server-config/option-sets/option-set/id
 |  |  +--ro binding-info*   +--rw hosts
 |  |      +--rw host* [cli-id]
 |  |     +--ro         +--rw cli-id                  uint32
 |  |     +--ro         +--rw duid
 |  |         |  +--ro  +--rw type-code?                   uint16
 |  |         |  +--rw (duid-type)?
 |  |         |     +--:(duid-llt)
 |  |         |     |  +--ro  +--rw duid-llt-hardware-type?      uint16
 |  |         |     |  +--ro  +--rw duid-llt-time?
       |     |     |     |  |        yang:timeticks
 |  |         |     |  +--ro  +--rw duid-llt-link-layer-addr?
       |     |     |     |  yang:mac-address
 |  |         |     +--:(duid-en)
 |  |         |     |  +--ro  +--rw duid-en-enterprise-number?  uint32
 |  |         |     |  +--ro  +--rw duid-en-identifier?         string
 |  |         |     +--:(duid-ll)
 |  |         |        +--ro     |  +--rw duid-ll-hardware-type?     uint16
 |  |         |        +--ro duid-ll-time?     |  +--rw duid-ll-link-layer-addr?  yang:mac-address
 |  |                yang:timeticks         |     +--:(duid-uuid)
 |     +--ro cli-iapd* [iaid]  |         |        +--ro iaid              uint32     |  +--rw uuid?                        yang:uuid
 |        +--ro cli-prefix*       inet:ipv6-prefix  |         |        +--ro cli-prefix-len*   uint8     +--:(duid-invalid)
 |  |        +--ro pool-id           uint8         |        +--rw hosts data?                        binary
 |        +--rw host* [cli-id]
       |           +--rw cli-id                  uint32
       |           +--rw duid
       |           |  +--rw (duid-type)?
       |           |     +--:(duid-llt)
       |           |     |  +--rw duid-llt-hardware-type?      uint16
       |           |     |  +--rw duid-llt-time?
       |           |     |  |       yang:timeticks
       |           |     |  +--rw duid-llt-link-layer-addr?
       |           |     |          yang:mac-address
       |           |     +--:(duid-en)
       |           |     |  +--rw duid-en-enterprise-number?   uint32
       |           |     |  +--rw duid-en-identifier?          string
       |           |     +--:(duid-ll)
       |           |        +--rw duid-ll-hardware-type?       uint16
       |           |        +--rw duid-ll-time?
       |           |                yang:timeticks  |         +--rw inherit-option-set      boolean
 |  |         +--rw option-set-id           uint8 option-set-id?
                  -> /server/server-config/option-sets/option-set/id
 |  |         +--rw nis-domain-name?        string
 |  |         +--rw nis-plus-domain-name?   string
 |  +--rw relay-opaque-paras
 |  |  +--rw relays* [relay-name]
 |  |     +--rw relay-name        string
 |  |     +--rw interface-info* [if-name]
 |  |     |  +--rw if-name         string
 |  |     |  +--rw interface-id    string
 |  |     +--rw subscribers* [subscriber]
 |  |     |  +--rw subscriber       uint8       uint32
 |  |     |  +--rw subscriber-id    string
 |  |     +--rw remote-host* [ent-num]
 |  |        +--rw ent-num      uint32
 |  |        +--rw remote-id    string
 |  +--rw rsoo-enabled-options
 |     +--rw rsoo-enabled-option* [option-code]
 |        +--rw option-code    uint16
 |        +--rw description    string
 +--ro packet-stats server-state
    +--ro solicit-count          uint32 network-ranges
    |  +--ro request-count          uint32 network-range* [network-range-id]
    |   +--ro renew-count network-range-id               uint32
    |   +--ro rebind-count           uint32 address-pools
    |   |  +--ro decline-count          uint32 address-pool* [pool-id]
    |   |  |  +--ro release-count pool-id                      uint32
    |   |  |  +--ro info-req-count         uint32 total-ipv6-count             uint64
    |   |  |  +--ro advertise-count        uint32 used-ipv6-count              uint64
    |   |  |  +--ro confirm-count          uint32 address-utilization-ratio    uint16
    |   |  +--ro reply-count binding-info* [cli-id]
    |   |     +--ro cli-id    uint32
    |   |     +--ro reconfigure-count duid
    |   |     |  +--ro type-code?                   uint16
    |   |     |  +--ro (duid-type)?
    |   |     |     +--:(duid-llt)
    |   |     |     |  +--ro duid-llt-hardware-type?   uint16
    |   |     |     |  +--ro duid-llt-time?            yang:timeticks
    |   |     |     |  +--ro duid-llt-link-layer-addr? yang:mac-address
    |   |     |     +--:(duid-en)
    |   |     |     |  +--ro duid-en-enterprise-number?   uint32
    |   |     |     |  +--ro relay-forward-count duid-en-identifier?          string
    |   |     |     +--:(duid-ll)
    |   |     |     |  +--ro duid-ll-hardware-type?       uint16
    |   |     |     |  +--ro duid-ll-link-layer-addr?  yang:mac-address
    |   |     |     +--:(duid-uuid)
    |   |     |     |  +--ro uuid?                        yang:uuid
    |   |     |     +--:(duid-invalid)
    |   |     |        +--ro data?                        binary
    |   |     +--ro cli-ia* [iaid]
    |   |        +--ro ia-type     string
    |   |        +--ro iaid        uint32
    |   |        +--ro relay-reply-count cli-addr*   inet:ipv6-address
    |   |        +--ro pool-id     uint32

                   Figure 1: DHCPv6 Data Model Structure

   Introduction of important nodes:

   o  serv-attributes: This container contains basic attributes of a
      DHCPv6 server such as DUID, server name and so on.  Some optional
      functions that can be provided by the server is also included.

   o  duid: Each server and client has only one DUID (DHCP Unique
      Identifier).  The DUID here identifies a unique DHCPv6 server for
      clients.  DUID consists of a two-octet type field and an arbitrary
      length (no more than 128 bytes) content field.

   o  pd-function: Whether the server can act as a delegating router to
      perform prefix delegation [RFC3633].

   o  operator-option-ipv6-address, operator-option-single-flag,
      operator-option-ipv6-prefix, operator-option-int32, operator-
      option-int16, operator-option-int8, operator-option-uri, operator-
      option-textstring, operator-option-var-data, operator-option-dns-
      wire: are generic option formats described in [RFC7227].

   o  stateless-service: A boolean value specifies whether the server
      support client-server exchanges involving two messages defined in
      [RFC3315].

   o  rapid-commit: Setting the value to '1' represents the server
      support the Solicit-Reply message exchange. '0' means the server
      will simply ignore the Rapid Commit option in Solicit message.

   o  interfaces-config: A leaf list to denote which one or more
      interfaces the server should listen on.  The default value 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 the server is being configured to
      listen on a unicast address assigned to a specific interface, the
      format "eth1/2001:db8::1" can be used.

   o  option-sets: DHCPv6 employs various options to carry additional
      information and parameters in DHCP messages.  This container
      defines all the possible options that need to be configured at the
      server side.  The relevant RFCs that define those options include:
      [RFC3315], [RFC3319], [RFC3646], [RFC3898], [RFC4242], [RFC4704],
      [RFC4833], [RFC5908], [RFC5970], [RFC4075], [RFC6334], [RFC6784],
      [RFC7078], [RFC7083], [RFC7291], [RFC7598].

   o  option-set: A server may allow different option sets to be
      configured for different conditions (i.e. different networks,
      clients and etc).  This "option-set" list enables various sets of
      options being defined and configured in a single server.
      Different sets are distinguished by the key called "option-set-
      id".  All the possible options discussed above are defined in the
      list and each option is corresponding to a container.  Since all
      the options in the list are optional, each container in this list
      has a boolean parameter called "enable" to indicate whether this
      option (container) will be included in the current option set or
      not.  With the "new-or-standard-option" list, it is easy to extend
      the model when new options are defined.  We could also use the
      "new-or-standard-option" list to define an IETF standard option.

   o  network-ranges: This model supports a hierarchy to achieve dynamic
      configuration.  That is to say we could configure the server at
      different levels through this model.  The top level is a global
      level which is defined as the container "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

   o  network-range: Under the "network-ranges" container, a "network-
      range" list is defined to configure the server 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.

   o  address-pools: Under the "network-range" list, a container
      describes the DHCPv6 server's address pools for a specific network
      is defined.  This container supports the server to be configured
      at a pool level.

   o  address-pool: A DHCPv6 server can be configured with several
      address pools for a specific network.  This list defines such
      address pools which are distinguish by the key called "pool-id".

   o  binding-info: A list records a binding information for each DHCPv6
      client that has already been allocated IPv6 addresses.

   o  prefix-pools: If a server supports prefix delegation function,
      this container under the "network-range" list will be valid to
      define the delegating router's prefix pools for a specific
      network.  This container also supports the server to be configured
      at a pool level.

   o  prefix-pool: Similar to server's address pools, a delegating
      router can also be configured with multiple prefix pools specified
      by a list called "prefix-pool".

   o  binding-info: A list records a binding information for each DHCPv6
      requesting router that has already been configured IPv6 prefixes.

   o  hosts: A server may also desire to be configured at a host level
      under some circumstances.  This container include a list called
      "host" to allow the server carrying different parameters (e.g.
      option sets) for different hosts.

   o  relay-opaque-paras: This container contains some opaque values in
      Relay Agent options that need to be configured on the server side
      only for value match.  Such Relay Agent options include Interface-
      Id option, Remote-Id option and Subscriber-Id option.

   o  rsoo-enabled-options: [RFC6422] requires that the server SHOULD
      have an administrator-configurable list of RSOO-enabled options.
      This container include a list called "rsoo-enabled-option" to
      allow new RSOO-enabled options to be defined at the server side.

   o  packet-stats: A container presents the packet statistics related
      to the DHCPv6 server.

2.2.  DHCPv6 Relay Tree Diagrams

   module: ietf-dhcpv6
       +--rw relay!
          +--rw relay-attributes
    |  +--rw name?          string   +--ro prefix-pools
    |   |  +--ro prefix-pool* [pool-id]
    |   |  |  +--ro pool-id                     uint32
    |   |  |  +--ro prefix-utilization-ratio    uint16
    |   |  +--ro binding-info* [cli-id]
    |   |     +--ro cli-id      uint32
    |   |     +--ro duid
    |   |     |  +--ro type-code?                   uint16
    |   |     |  +--ro (duid-type)?
    |   |     |     +--:(duid-llt)
    |   |     |     |  +--ro duid-llt-hardware-type?   uint16
    |   |     |     |  +--ro duid-llt-time?            yang:timeticks
    |  +--rw description?   string   |  +--rw dest-addrs*    inet:ipv6-address     |  +--rw subscribers* [subscriber]     |  +--ro duid-llt-link-layer-addr? yang:mac-address
    |  +--rw subscriber       uint8   |     |  +--rw subscriber-id    string     +--:(duid-en)
    |  +--rw remote-host* [ent-num]   |     |  +--rw ent-num     |  +--ro duid-en-enterprise-number?   uint32
    |   |  +--rw remote-id     |     |  +--ro duid-en-identifier?          string
    |  +--rw vendor-info   |     +--rw ent-num     |     +--:(duid-ll)
    |   |     |     |  +--ro duid-ll-hardware-type?    uint16
    |   |     |     |  +--ro duid-ll-link-layer-addr?  yang:mac-address
    |   |     |     +--:(duid-uuid)
    |   |     |     |  +--ro uuid?                       yang:uuid
    |   |     |     +--:(duid-invalid)
    |   |     |        +--ro data?                       binary
    |   |     +--ro cli-iapd* [iaid]
    |   |        +--ro iaid              uint32
    |     +--rw data*      string
          +--rw relay-supplied-options-option   |  +--rw rsoo-set* [rsoo-set-id]        +--ro cli-prefix*       inet:ipv6-prefix
    |     +--rw rsoo-set-id   |        +--ro cli-prefix-len*   uint8
    |     +--rw erp-local-domain-name-option   |        +--rw enable            boolean        +--ro pool-id           uint32
    |        +--rw erp-for-client*   +--ro address-prefix-assign-param* [cli-id]
    |           +--rw      +--ro cli-id                      uint32
    |           +--rw      +--ro source-ipv6-addr?           inet:ipv6-address
    |      +--ro duid
    |      |  +--ro type-code?                   uint16
    |      |  +--ro (duid-type)?
    |      |     +--:(duid-llt)
    |      |     |  +--ro duid-llt-hardware-type?   uint16
    |      |     |  +--ro duid-llt-time?            yang:timeticks
    |      |     |  +--ro duid-llt-link-layer-addr? yang:mac-address
    |      |     +--:(duid-en)
    |      |     |  +--ro duid-en-enterprise-number?   uint32
    |      |     |  +--ro duid-en-identifier?          string
    |      |     +--:(duid-ll)
    |      |     |  +--ro duid-ll-hardware-type?     uint16
    |      |     |  +--ro duid-ll-link-layer-addr? yang:mac-address
    |      |     +--:(duid-uuid)
    |      |     |  +--ro uuid?                        yang:uuid
    |      |     +--:(duid-invalid)
    |      |        +--ro data?                        binary
    |      +--ro iaid*                       uint32
    |      +--ro preferred-addr*             inet:ipv6-address
    |      +--ro preferred-prefix-len*       uint8
    |      +--ro client-fqdn?                string
    |      +--ro client-link-layer-addr?     uint16
    |      +--ro client-enterprise-number?   uint32
    |      +--ro client-sys-archi-type*      uint16
    +--ro packet-stats
       +--ro solicit-count          uint32
       +--ro request-count          uint32
       +--ro renew-count            uint32
       +--ro rebind-count           uint32
       +--ro decline-count          uint32
       +--ro release-count          uint32
       +--ro info-req-count         uint32
       +--ro advertise-count        uint32
       +--ro confirm-count          uint32
       +--ro reply-count            uint32
       +--ro reconfigure-count      uint32
       +--ro relay-forward-count    uint32
       +--ro relay-reply-count      uint32

notifications:
+---n notifications
   +--ro dhcpv6-server-event
      +--ro pool-running-out
      |  +--ro max-address-utilization-ratio    uint16
      |  +--ro address-utilization-ratio        uint16
      |  +--ro max-prefix-utilization-ratio     uint16
      |  +--ro prefix-utilization-ratio         uint16
      |  +--ro duid
      |  |  +--rw  +--ro type-code?                   uint16
      |  |  +--ro (duid-type)?
      |  |     +--:(duid-llt)
      |  |     |  +--rw  +--ro duid-llt-hardware-type?    uint16
      |  |     |  +--rw  +--ro duid-llt-time?
          |           |     |  |             yang:timeticks
      |  |     |  +--rw  +--ro duid-llt-link-layer-addr?
          |           |     |  yang:mac-address
      |  |     +--:(duid-en)
      |  |     |  +--rw  +--ro duid-en-enterprise-number? uint32
      |  |     |  +--rw  +--ro duid-en-identifier?        string
      |  |     +--:(duid-ll)
      |  |        +--rw     |  +--ro duid-ll-hardware-type?    uint16
      |  |        +--rw duid-ll-time?     |  +--ro duid-ll-link-layer-addr?  yang:mac-address
      |  |                yang:timeticks     +--:(duid-uuid)
      |           +--rw erp-name  |     |  +--ro uuid?                     yang:uuid
      |  |     +--:(duid-invalid)
      |  |        +--ro data?                        binary
      |  +--ro serv-name?                       string
          +--rw relay-if* [if-name]
      |  +--rw if-name  +--ro pool-name                        string
      +--ro invalid-client-detected
         +--ro duid
         |  +--rw enable          boolean  +--ro type-code?                   uint16
         |  +--rw ipv6-address?   inet:ipv6-address  +--ro (duid-type)?
         |  +--rw interface-id?   string     +--:(duid-llt)
         |  +--rw rsoo-set*       uint8     |  +--rw pd-route* [pd-route-id]  +--ro duid-llt-hardware-type?    uint16
         |     |  +--rw pd-route-id             uint8  +--ro duid-llt-time?            yang:timeticks
         |     |  +--rw requesting-router-id    uint32  +--ro duid-llt-link-layer-addr? yang:mac-address
         |     +--:(duid-en)
         |  +--rw delegating-router-id     |  +--ro duid-en-enterprise-number?  uint32
         |     |  +--rw next-router             inet:ipv6-address  +--ro duid-en-identifier?         string
         |     +--:(duid-ll)
         |  +--rw last-router             inet:ipv6-address     |  +--rw next-entity* [dest-addr]  +--ro duid-ll-hardware-type?    uint16
         |     +--rw dest-addr       inet:ipv6-address     |     +--rw available       boolean  +--ro duid-ll-link-layer-addr?  yang:mac-address
         |     +--rw multicast     +--:(duid-uuid)
         |     |  +--ro uuid?                     yang:uuid
         |     +--:(duid-invalid)
         |        +--ro data?                     binary
         +--ro description?   string

                   Figure 1: DHCPv6 Data Model Structure

   Introduction of important nodes:

   o  server-config: This container contains the configuration data of a
      server.

   o  serv-attributes: This container contains basic attributes of a
      DHCPv6 server such as DUID, server name and so on.  Some optional
      functions that can be provided by the server is also included.

   o  duid: Each server and client has only one DUID (DHCP Unique
      Identifier).  The DUID here identifies a unique DHCPv6 server for
      clients.  DUID consists of a two-octet type field and an arbitrary
      length (no more than 128 bytes) content field.  Currently there
      are four defined types of DUIDs in [RFC3315] and [RFC6355] - DUID-
      LLT, DUID-EN, DUID-LL and DUID-UUID.  DUID-INVALID represents
      those unconventional DUIDs.

   o  pd-function: Whether the server can act as a delegating router to
      perform prefix delegation [RFC3633].

   o  operator-option-ipv6-address, operator-option-single-flag,
      operator-option-ipv6-prefix, operator-option-int32, operator-
      option-int16, operator-option-int8, operator-option-uri, operator-
      option-textstring, operator-option-var-data, operator-option-dns-
      wire: are generic option formats described in [RFC7227].

   o  stateless-service: A boolean
          |     +--rw value specifies whether the server          boolean
          |     +--ro packet-stats
          |        +--ro cli-packet-rvd-count    uint32
          |        +--ro solicit-rvd-count       uint32
          |        +--ro request-rvd-count       uint32
          |        +--ro renew-rvd-count         uint32
          |        +--ro rebind-rvd-count        uint32
          |        +--ro decline-rvd-count       uint32
          |        +--ro release-rvd-count       uint32
          |        +--ro info-req-rvd-count      uint32
          |        +--ro relay-for-rvd-count     uint32
          |        +--ro relay-rep-rvd-count     uint32
          |        +--ro packet-to-cli-count     uint32
          |        +--ro adver-sent-count        uint32
          |        +--ro confirm-sent-count      uint32
          |        +--ro reply-sent-count        uint32
          |        +--ro reconfig-sent-count     uint32
          |        +--ro relay-for-sent-count    uint32
          |        +--ro relay-rep-sent-count    uint32
          +--ro relay-stats
             +--ro cli-packet-rvd-count      uint32
             +--ro relay-for-rvd-count       uint32
             +--ro relay-rep-rvd-count       uint32
             +--ro packet-to-cli-count       uint32
             +--ro relay-for-sent-count      uint32
             +--ro relay-rep-sent-count      uint32
             +--ro discarded-packet-count    uint32

   Introduction
      support client-server exchanges involving two messages defined in
      [RFC3315].

   o  rapid-commit: Setting the value to '1' represents the server
      support the Solicit-Reply message exchange. '0' means the server
      will simply ignore the Rapid Commit option in Solicit message.

   o  interfaces-config: A leaf list to denote which one or more
      interfaces the server should listen on.  The default value 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 the server is being configured to
      listen on a unicast address assigned to a specific interface, the
      format "eth1/2001:db8::1" can be used.

   o  option-sets: DHCPv6 employs various options to carry additional
      information and parameters in DHCP messages.  This container
      defines all the possible options that need to be configured at the
      server side.  The relevant RFCs that define those options include:
      [RFC3315], [RFC3319], [RFC3646], [RFC3898], [RFC4242], [RFC4704],
      [RFC4833], [RFC5908], [RFC5970], [RFC4075], [RFC6334], [RFC6784],
      [RFC7078], [RFC7083], [RFC7291], [RFC7598].

   o  option-set: A server may allow different option sets to be
      configured for different conditions (i.e. different networks,
      clients and etc).  This "option-set" list enables various sets of important nodes:
      options being defined and configured in a single server.
      Different sets are distinguished by the key called "option-set-
      id".  All the possible options discussed above are defined in the
      list and each option is corresponding to a container.  Since all
      the options in the list are optional, each container in this list
      has a 'presence' statement to indicate whether this option
      (container) will be included in the current option set or not.  In
      addition, each container also has a 'if-feature' statement to
      indicate whether the server supports this option (container).

   o  network-ranges: This model supports a hierarchy to achieve dynamic
      configuration.  That is to say we could configure the server at
      different levels through this model.  The top level is a global
      level which is defined as the container "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

   o  network-range: Under the "network-ranges" container, a "network-
      range" list is defined to configure the server 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.

   o  relay-attributes: A  address-pools: Under the "network-range" list, a container
      describes some basic attributes of the relay agent including some relay agent DHCPv6 server's address pools for a specific options data
      that need network
      is defined.  This container supports the server to be configured previously.  Such options include
      Remote-Id option and Subscriber-Id option.
      at a pool level.

   o  dest-addrs: Each  address-pool: A DHCPv6 relay agent may server can be configured with several
      address pools for a list
      of destination addresses. specific network.  This node list defines such a list
      address pools which are distinguish by the key called "pool-id".

   o  max-address-utilization-ratio: The threshold of IPv6
      addresses that may include unicast addresses, multicast addresses
      or other addresses. address pool
      utiliztion, the value of which is settable.

   o  relay-supplied-options-option: DHCPv6 relay agent could provide
      some  binding-info: A list records a binding information for each DHCPv6
      client that would has already been allocated IPv6 addresses.

   o  prefix-pools: If a server supports prefix delegation function,
      this container under the "network-range" list will be useful to DHCPv6 client.  Since
      relay agent cannot provide options directly valid to
      define the client,
      [RFC6422] defines RSOO-enabled options to propose options delegating router's prefix pools for a specific
      network.  This container also supports the server to send be configured
      at a pool level.

   o  prefix-pool: Similar to server's address pools, a delegating
      router can also be configured with multiple prefix pools specified
      by a list called "prefix-pool".

   o  max-prefix-utilization-ratio: The threshold of prefix pool
      utiliztion, the client. value of which is settable.

   o  binding-info: A list records a binding information for each DHCPv6
      requesting router that has already been configured IPv6 prefixes.

   o  hosts: A server may also desire to be configured at a host level
      under some circumstances.  This container models such RSOO-
      enabled options.

   o  rsoo-set: This include a list under the "relay-supplied-options-option"
      container is similar called
      "host" to allow the "option-set" defined in server
      feature.  It allows the relay to implement several sets of RSOO-
      enabled options carrying different parameters (e.g.
      option sets) for different interfaces.  The list only include
      the EAP Re-authentication Protocol (ERP) Local Domain Name DHCPv6
      Option defined hosts.

   o  relay-opaque-paras: This container contains some opaque values in [RFC6440], since it is the only one RSOO-enabled
      Relay Agent options accepted by IANA so far.

   o  relay-if: A relay agent may have several interfaces, we should
      provide a way that need to configure and manage parameters be configured on the interface-
      level.  A list that describes specific interfaces server side
      only for value match.  Such Relay Agent options include Interface-
      Id option, Remote-Id option and their
      corresponding parameters is employed to fulfil Subscriber-Id option.

   o  rsoo-enabled-options: [RFC6422] requires that the configfuration.
      Here we use server SHOULD
      have an administrator-configurable list of RSOO-enabled options.
      This container include a string list called "if-name" as "rsoo-enabled-option" to
      allow new RSOO-enabled options to be defined at the key of list. server side.

   o  pd-route: A sub-container of "relay-if" which describes the route
      for delegated prefixes into  server-state: This container includes the provider edge router. state data of a server.

   o  next-entity:  address-prefix-assign-param: This node defines a list includes some parameters/
      identifiers that is used to describe the
      next hop entity of server obtains from DHCPv6 options in this relay agent.  Different entities are
      distinguished by their addresses.
      network-range.  The server may take these parameters/identifiers
      into account when assigning a(n) address/prefix.

   o  packet-stats: A container shows packet state information of a
      specific data communication.

   o  relay-stats: The "relay-stats" container records and presents the
      overall packet statistics of related
      to the relay agent.

2.3. DHCPv6 Client Tree Diagrams

   module: ietf-dhcpv6
       +--rw client!
          +--rw duid
          |  +--rw (duid-type)?
          |     +--:(duid-llt)
          |     |  +--rw duid-llt-hardware-type?      uint16
          |     |  +--rw duid-llt-time?               yang:timeticks
          |     |  +--rw duid-llt-link-layer-addr?    yang:mac-address
          |     +--:(duid-en)
          |     |  +--rw duid-en-enterprise-number?   uint32
          |     |  +--rw duid-en-identifier?          string
          |     +--:(duid-ll)
          |        +--rw duid-ll-hardware-type?       uint16
          |        +--rw duid-ll-time?                yang:timeticks
          +--rw client-if* [if-name]
             +--rw if-name                      string
             +--rw cli-id                       uint32
             +--rw description?                 string
             +--rw pd-function                  boolean
             +--rw rapid-commit                 boolean
             +--rw mo-tab
             |  +--rw m-tab    boolean
             |  +--rw o-tab    boolean
             +--rw oro-options
             |  +--rw oro-option* [option-code]
             |     +--rw option-code    uint16
             |     +--rw description    string
             +--rw client-configured-options
             |  +--rw new-or-standard-cli-option* [option-code]
             |  |  +--rw option-code           uint16
             |  |  +--rw option-name           string
             |  |  +--rw option-description    string
             |  |  +--rw option-reference?     string
             |  |  +--rw option-value          string
             |  +--rw user-class-option
             |  |  +--rw enable        boolean
             |  |  +--rw user-class* [user-class-id]
             |  |     +--rw user-class-id      uint8
             |  |     +--rw user-class-info    string
             |  +--rw vendor-class-option
             |  |  +--rw enable     boolean
             |  |  +--rw ent-num    uint32
             |  |  +--rw data*      string
             |  +--rw client-fqdn-option
             |  |  +--rw enable                    boolean
             |  |  +--rw fqdn                      string
             |  |  +--rw server-initiate-update    boolean
             |  |  +--rw client-initiate-update    boolean
             |  +--rw client-architecture-type-option
             |  |  +--rw enable                boolean
             |  |  +--rw architecture-types* [type-id]
             |  |     +--rw type-id           uint16
             |  |     +--rw most-preferred    boolean
             |  +--rw client-network-interface-option
             |  |  +--rw enable    boolean
             |  |  +--rw type      uint8
             |  |  +--rw major     uint8
             |  |  +--rw minor     uint8
             |  +--rw kerberos-principal-name-option
             |  |  +--rw enable            boolean
             |  | server.

   Information about notifications:

   o  pool-running-out: raised 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.

   o  invalid-client-detected: raised when the server has found a client
      which can be regarded as a potential attacker.  Some description
      could also be included.

2.2.  DHCPv6 Relay Tree Diagrams

module: ietf-dhcpv6-relay
    +--rw principal-name    string
             | relay!
       +--rw client-link-layer-addr-option relay-config
       |  +--rw enable             boolean relay-attributes
       |     +--rw link-layer-type    uint16  |  +--rw link-layer-addr    string
             +--ro identity-associations
             |  +--ro identity-association* [iaid]
             |     +--ro iaid                  uint32
             |     +--ro ia-type               string
             |     +--ro ipv6-addr*            inet:ipv6-address
             |     +--ro ipv6-prefix*          inet:ipv6-prefix
             |     +--ro prefix-length*        uint8
             |     +--ro t1-time               yang:timeticks
             |     +--ro t2-time               yang:timeticks
             |     +--ro preferred-lifetime    yang:timeticks
             |     +--ro valid-lifetime        yang:timeticks
             +--ro if-other-paras
             |  +--ro uni-dhcpv6-serv-addr*      inet:ipv6-address
             |  +--ro dns-paras
             |  |  +--ro domain-search-list    string
             |  |  +--ro dns-servers* [dns-serv-id]
             |  |     +--ro dns-serv-id      uint8
             |  |     +--ro dns-serv-addr    inet:ipv6-address
             |  +--ro sip-paras
             |  |  +--ro sip-servers* [sip-serv-id]
             |  |     +--ro sip-serv-id             uint8
             |  |     +--ro sip-serv-addr           inet:ipv6-address
             |  |     +--ro sip-serv-domain-name    string
             |  +--ro nis-paras
             |  |  +--ro nis-domain-name    string
             |  |  +--ro nis-server* [nis-serv-id]
             |  |     +--ro nis-serv-id      uint8
             |  |     +--ro nis-serv-addr    inet:ipv6-address
             |  +--ro nis-plus-paras
             |  |  +--ro nis-plus-domain-name    string
             |  |  +--ro nis-plus-server* [nis-plus-serv-id]
             |  |     +--ro nis-plus-serv-id      uint8
             |  |     +--ro nis-plus-serv-addr    inet:ipv6-address
             |  +--ro info-refresh-time?         yang:timeticks
             |  +--ro time-zone-paras
             |  |  +--ro tz-posix       string
             |  |  +--ro tz-database    string
             |  +--ro cli-fqdn?                  string
             |  +--ro ntp-paras
             |  |  +--ro ntp-server* [ntp-serv-id]
             |  |     +--ro ntp-serv-id          uint8
             |  |     +--ro ntp-serv-addr        inet:ipv6-address
             |  |     +--ro ntp-serv-mul-addr    inet:ipv6-address
             |  |     +--ro ntp-serv-fqdn name?          string
       |  +--ro sntp-paras
             |  |  +--ro sntp-server* [sntp-serv-id]
             |  |     +--ro sntp-serv-id      uint8  +--rw description?   string
       |  |     +--ro sntp-serv-addr  +--rw dest-addrs*    inet:ipv6-address
       |  +--ro network-boot-paras  |  +--rw subscribers* [subscriber]
       |  +--ro boot-file* [boot-file-id]  |  |     +--ro boot-file-id  +--rw subscriber       uint8
       |  |     +--ro suitable-arch-type*   uint16  |  +--rw subscriber-id    string
       |     +--ro suitable-net-if*  |  +--rw remote-host* [ent-num]
       |  |  |  +--rw ent-num      uint32
       |  |     +--ro boot-file-url  |  +--rw remote-id    string
       |  |     +--ro boot-file-paras* [para-id]  +--rw vendor-info
       |  |        +--ro para-id      uint8     +--rw ent-num    uint32
       |  |        +--ro parameter     +--rw data*      string
       |  +--ro kerberos-paras  +--rw rsoo-option-sets
       |  |  +--ro default-realm-name    string  +--rw option-set* [id]
       |  |  +--ro kdc-info* [kdc-id]     +--rw id                              uint32
       |  |     +--ro kdc-id            uint8     +--rw erp-local-domain-name-option!
                                      {erp-local-domain-name-op}?
       |  |     +--ro priority          uint16        +--rw erp-for-client* [cli-id]
       |  |     +--ro weight            uint16           +--rw cli-id      uint32
       |  |     +--ro transport-type    uint8           +--rw duid
       |  |     +--ro port-number           |  +--rw type-code?                   uint16
       |  |     +--ro kdc-ipv6-addr     inet:ipv6-address           |  +--rw (duid-type)?
       |     +--ro realm-name        string  |  +--ro addr-selection-paras           |     +--:(duid-llt)
       |  +--ro automatic-row-add        boolean  |           |  +--ro prefer-temporary-addr    boolean     |  +--rw duid-llt-hardware-type?      uint16
       |  +--ro policy-table* [policy-id]  |           |     +--ro policy-id     uint8     |  +--rw duid-llt-time?
                                                          yang:timeticks
       |     +--ro label         uint8  |           |     +--ro precedence    uint8     |  +--rw duid-llt-link-layer-addr?
                                                        yang:mac-address
       |     +--ro prefix-len    uint8  |           |     +--ro prefix        inet:ipv6-prefix     +--:(duid-en)
       |  +--ro sol-max-rt                 yang:timeticks  |  +--ro inf-max-rt                 yang:timeticks           |  +--ro pcp-server-paras     |  +--rw duid-en-enterprise-number?   uint32
       |  +--ro pcp-server* [pcp-serv-id]  |           |     +--ro pcp-serv-id      uint8     |  +--rw duid-en-identifier?          string
       |     +--ro pcp-serv-addr    inet:ipv6-address  |  +--ro s46-rule-paras           |     +--:(duid-ll)
       |  +--ro s46-rule* [rule-id]  |           |     +--ro rule-id           uint8     |  +--rw duid-ll-hardware-type?       uint16
       |     +--ro rule-type         enumeration  |           |     +--ro ea-len            uint8     |  +--rw duid-ll-link-layer-addr?
                                                        yang:mac-address
       |     +--ro prefix4-len       uint8  |           |     +--ro ipv4-prefix       inet:ipv4-prefix     +--:(duid-uuid)
       |  |     +--ro prefix6-len       uint8           |     |     +--ro ipv6-prefix       inet:ipv6-prefix  +--rw uuid?                        yang:uuid
       |  |     +--ro port-parameter           |     +--:(duid-invalid)
       |        +--ro offset      uint8  |           |        +--ro psid-len    uint8        +--rw data?                        binary
       |  |        +--ro psid        uint16           +--rw erp-name    string
       |  +--ro s46-br-paras  +--rw relay-if* [if-name]
       |     +--rw if-name               string
       |  +--ro br* [br-id]     +--rw enable                boolean
       |     +--rw ipv6-address?         inet:ipv6-address
       |     +--ro br-id           uint8     +--rw interface-id?         string
       |     +--rw rsoo-option-set-id?
                    -> /relay/relay-config/rsoo-option-sets/option-set/id
       |     +--ro br-ipv6-addr     +--rw next-entity* [dest-addr]
       |        +--rw dest-addr    inet:ipv6-address
       |  +--ro s46-dmr-paras        +--rw available    boolean
       |        +--rw multicast    boolean
       |        +--rw server       boolean
       +--ro dmr* [dmr-id] relay-state
          +--ro relay-if* [if-name]
          |  +--ro if-name        string
          |  +--ro dmr-id             uint8 pd-route* [pd-route-id]
          |  |  +--ro dmr-prefix-len pd-route-id             uint8
          |  |  +--ro dmr-ipv6-prefix    inet:ipv6-prefix
             |  +--ro s46-v4-v6-binding-paras requesting-router-id    uint32
          |  |  +--ro ipv4-addr                inet:ipv4-address delegating-router-id    uint32
          |  |  +--ro bind-prefix6-len         uint8 next-router             inet:ipv6-address
          |  |  +--ro port-parameter
             | last-router             inet:ipv6-address
          |  +--ro next-entity* [dest-addr]
          |     +--ro offset      uint8 dest-addr       inet:ipv6-address
          |     +--ro packet-stats
          |        +--ro solicit-rvd-count       uint32
          |        +--ro psid-len    uint8 request-rvd-count       uint32
          |        +--ro renew-rvd-count         uint32
          |        +--ro rebind-rvd-count        uint32
          |        +--ro psid        uint16 decline-rvd-count       uint32
          |        +--ro release-rvd-count       uint32
          |        +--ro erp-local-domain-name    string info-req-rvd-count      uint32
          |        +--ro supported-options relay-for-rvd-count     uint32
          |        +--ro supported-option* [option-code] relay-rep-rvd-count     uint32
          |        +--ro option-code    uint16 packet-to-cli-count     uint32
          |        +--ro description    string adver-sent-count        uint32
          |        +--ro packet-stats confirm-sent-count      uint32
          |        +--ro solicit-count reply-sent-count        uint32
          |        +--ro request-count reconfig-sent-count     uint32
          |        +--ro renew-count relay-for-sent-count    uint32
          |        +--ro rebind-count relay-rep-sent-count    uint32
          +--ro decline-count relay-stats
             +--ro cli-packet-rvd-count      uint32
             +--ro release-count relay-for-rvd-count       uint32
             +--ro info-req-count relay-rep-rvd-count       uint32
             +--ro advertise-count packet-to-cli-count       uint32
             +--ro confirm-count relay-for-sent-count      uint32
             +--ro reply-count relay-rep-sent-count      uint32
             +--ro reconfigure-count discarded-packet-count    uint32

   Introduction of important nodes:

   o  client-if: A client may have several interfaces, it is more
      reasonable to configure and manage parameters on the interface-
      level.  The list defines a specific client interface and its data.
      Different interfaces are distinguished by the "ifName" key which
      is a configurable string value.

   o  duid: Each server and client has only one DUID (DHCP Unique
      Identifier).  The DUID here will be carried in the Client ID
      option to identify a specific DHCPv6 client.  This leaf are same
      as the "duid" leaf in "dhcpv6-server" feature.

   o  pd-function: Whether the client can act as a requesting router to
      request prefixes using prefix delegation ([RFC3633]).

   o  rapid-commit: '1' indicates a client can initiate a Solicit-Reply
      message exchange by adding a Rapid Commit option in Solicit
      message.  '0' means the client is not allowed to add a Rapid
      Commit option to request addresses in a two-message exchange
      pattern.

  notifications:
    +---n notifications
       +--ro dhcpv6-relay-event
          +--ro topo-changed
             +--ro relay-if-name       string
             +--ro first-hop           boolean
             +--ro last-entity-addr    inet:ipv6-address

   Introduction of important nodes:

   o  mo-tab: The management tab label indicates  relay-config: This container contains the operation mode configuration data of
      the DHCPv6 client. 'm'=1 and 'o'=1 indicate the client will use
      DHCPv6 to obtain all the configuration data. 'm'=1 and 'o'=0 are a
      meaningless combination. 'm'=0 and 'o'=1 indicate relay.

   o  relay-attributes: A container describes some basic attributes of
      the client will
      use stateless DHCPv6 to obtain configuration relay agent including some relay agent specific options data apart from
      addresses/prefixes data. 'm'=0 and 'o'=0 represent the client will
      not use DHCPv6 but use SLAAC
      that need to achieve configuration. be configured previously.  Such options include
      Remote-Id option and Subscriber-Id option.

   o  oro-options:  dest-addrs: Each DHCPv6 relay agent may be configured with a list
      of destination addresses.  This container provide node defines such a way to configure the list of
      options IPv6
      addresses that the client will request in its ORO option. may include unicast addresses, multicast addresses
      or other addresses.

   o  client-configured-options: Similar  rsoo-options-sets: DHCPv6 relay agent could provide some
      information that would be useful to DHCPv6 client.  Since relay
      agent cannot provide options directly to the server, the client also
      need client, [RFC6422]
      defines RSOO-enabled options to configure some propose options for the server to fulfil some desired functions.
      send to the client.  This container include all models such RSOO-enabled
      options.

   o  option-set: This list under the "rsoo-option-sets" container is
      similar to the potential options that need defined in server module.  It allows the relay
      to be
      configured at implement several sets of RSOO-enabled options for different
      interfaces.  The list only include the EAP Re-authentication
      Protocol (ERP) Local Domain Name DHCPv6 Option defined in
      [RFC6440], since it is the client side.  The relevant RFCs that define
      those only one RSOO-enabled options include: [RFC3315], [RFC4704], [RFC5970], [RFC6784],
      [RFC6939]. accepted
      by IANA so far.

   o  identity-association: IA is a construct through which a server and  relay-if: A relay agent may have several interfaces, we should
      provide a client can identify, group, way to configure and manage a set of related IPv6
      addresses.  The key of parameters on the "identity-association" interface-
      level.  A list that describes specific interfaces and their
      corresponding parameters is employed to fulfil the configfuration.
      Here we use a 4-byte
      number IAID defined in [RFC3315]. string called "if-name" as the key of list.

   o  if-other-paras: A client can obtain extra configuration data other
      than address and prefix information through DHCPv6 options.  relay-state: This container describes such data contains the client was configured through
      DHCPv6.  The potential configuration data may include DNS server
      parameters, SIP server parameters and etc. of the
      relay.

   o  pd-route: A sub-container of "relay-if" which describes the route
      for delegated prefixes into the provider edge router.

   o  supported-options:  next-entity: This state data container node defines a list that is used to describe the
      next hop entity of
      options supported this relay agent.  Different entities are
      distinguished by the client for administrator to interrogate a
      client's capabilities. their addresses.

   o  packet-stats: A container records all the shows packet status state information of a
      specific interface.

2.4.  Notifications Mechanism for data communication.

   o  relay-stats: The "relay-stats" container records and presents the
      overall packet statistics of the relay agent.

   Information about notifications:

   o  topo-changed: raised when the topology of the relay agent is
      changed.

2.3.  DHCPv6 Client Tree Diagrams

module: ietf-dhcpv6-client
    +--rw client!
       +--rw client-config
       |  +--rw duid
       |  |  +--rw type-code?                   uint16
       |  |  +--rw (duid-type)?
       |  |     +--:(duid-llt)
       |  |     |  +--rw duid-llt-hardware-type?      uint16
       |  |     |  +--rw dhcpv6
      +-- ... duid-llt-time?               yang:timeticks
       |  |     |  +--rw duid-llt-link-layer-addr?    yang:mac-address
       |  |     +--:(duid-en)
       |  |     |  +--rw duid-en-enterprise-number?   uint32
       |  |     |  +--rw duid-en-identifier?          string
       |  |     +--:(duid-ll)
       |  |     |  +--rw duid-ll-hardware-type?       uint16
       |  |     |  +--rw duid-ll-link-layer-addr?     yang:mac-address
       |  |     +--:(duid-uuid)
       |  |     |  +--rw uuid?                        yang:uuid
       |  |     +--:(duid-invalid)
       |  |        +--rw data?                        binary
       |  +--rw client-if* [if-name]
       |     +--rw if-name                      string
       |     +--rw cli-id                       uint32
       |     +--rw description?                 string
       |     +--rw pd-function                  boolean
       |     +--rw rapid-commit                 boolean
       |     +--rw mo-tab
       |     |  +--rw m-tab    boolean
       |     |  +--rw o-tab    boolean
       |     +--rw client-configured-options
       |        +--rw new-or-standard-cli-option* [option-code]
       |        |  +--rw option-code           uint16
       |        |  +--rw option-name           string
       |        |  +--rw option-description    string
       |        |  +--rw option-reference?     string
       |        |  +--rw option-value          string
       |        +--rw option-request-option! {option-request-op}?
       |        |  +--rw oro-option* [option-code]
       |        |     +--rw option-code    uint16
       |        |     +--rw description    string
       |        +--rw user-class-option! {user-class-op}?
       |        |  +--rw user-class* [user-class-id]
       |        |     +--rw user-class-id      uint8
       |        |     +--rw user-class-data    string
       |        +--rw vendor-class-option! {vendor-class-op}?
       |        |  +--rw enterprise-number    uint32
       |        |  +--rw vendor-class* [vendor-class-id]
       |        |     +--rw vendor-class-id      uint8
       |        |     +--rw vendor-class-data    string
       |        +--rw client-fqdn-option! {client-fqdn-op}?
       |        |  +--rw fqdn                      string
       |        |  +--rw server-initiate-update    boolean
       |        |  +--rw client-initiate-update    boolean
       |        +--rw client-arch-type-option! {client-arch-type-op}?
       |        |  +--rw architecture-types* [type-id]
       |        |     +--rw type-id           uint16
       |        |     +--rw most-preferred    boolean
       |        +--rw client-network-interface-identifier-option!
                            {client-network-interface-identifier-op}?
       |        |  +--rw type     uint8
       |        |  +--rw major    uint8
       |        |  +--rw minor    uint8
       |        +--rw kbr-principal-name-option! {kbr-principal-name-op}?
       |        |  +--rw principle-name* [principle-name-id]
       |        |     +--rw principle-name-id    uint8
       |        |     +--rw name-type            int32
       |        |     +--rw name-string          string
       |        +--rw kbr-realm-name-option! {kbr-realm-name-op}?
       |        |  +--rw realm-name    string
       |        +--rw client-link-layer-addr-option!
                                    {client-link-layer-addr-op}?
       |           +--rw link-layer-type    uint16
       |           +--rw link-layer-addr    string
       +--ro client-state
          +--ro if-other-paras
             +--ro server-unicast-option! {server-unicast-op}?
             |  +--ro server-address?   inet:ipv6-address
             +--ro sip-server-domain-name-list-option!
                              {sip-server-domain-name-list-op}?
             |  +--ro sip-serv-domain-name    string
             +--ro sip-server-address-list-option!
                                  {sip-server-address-list-op}?
             |  +--ro sip-server* [sip-serv-id]
             |     +--ro sip-serv-id      uint8
             |     +--ro sip-serv-addr    inet:ipv6-address
             +--ro dns-config-option! {dns-config-op}?
             |  +--ro dns-server* [dns-serv-id]
             |     +--ro dns-serv-id      uint8
             |     +--ro dns-serv-addr    inet:ipv6-address
             +--ro domain-searchlist-option! {domain-searchlist-op}?
             |  +--ro domain-searchlist* [domain-searchlist-id]
             |     +--ro domain-searchlist-id        uint8
             |     +--ro domain-search-list-entry    string
             +--ro nis-config-option! {nis-config-op}?
             |  +--ro nis-server* [nis-serv-id]
             |     +--ro nis-serv-id      uint8
             |     +--ro nis-serv-addr    inet:ipv6-address
             +--ro nis-plus-config-option! {nis-plus-config-op}?
             |  +--ro nis-plus-server* [nis-plus-serv-id]
             |     +--ro nis-plus-serv-id      uint8
             |     +--ro nis-plus-serv-addr    inet:ipv6-address
             +--ro nis-domain-name-option! {nis-domain-name-op}?
             |  +--ro nis-domain-name?   string
             +--ro nis-plus-domain-name-option! {nis-plus-domain-name-op}?
             |  +--ro nis-plus-domain-name?   string
             +--ro sntp-server-option! {sntp-server-op}?
             |  +--ro sntp-server* [sntp-serv-id]
             |     +--ro sntp-serv-id      uint8
             |     +--ro sntp-serv-addr    inet:ipv6-address
             +--ro info-refresh-time-option! {info-refresh-time-op}?
             |  +--ro info-refresh-time    yang:timeticks
             +--ro client-fqdn-option! {client-fqdn-op}?
             |  +--ro server-initiate-update    boolean
             |  +--ro client-initiate-update    boolean
             |  +--ro modify-name-from-cli      boolean
             +--ro posix-timezone-option! {posix-timezone-op}?
             |  +--ro tz-posix    string
             +--ro tzdb-timezone-option! {tzdb-timezone-op}?
             |  +--ro tz-database    string
             +--ro ntp-server-option! {ntp-server-op}?
             |  +--ro ntp-server* [ntp-serv-id]
             |     +--ro ntp-serv-id                    uint8
             |     +--ro (ntp-time-source-suboption)?
             |        +--:(server-address)
             |        |  +--ro ntp-serv-addr-suboption*  inet:ipv6-address
             |        +--:(server-multicast-address)
             |        |  +--ro ntp-serv-mul-addr-suboption*
                                                        inet:ipv6-address
             |        +--:(server-fqdn)
             |           +--ro ntp-serv-fqdn-suboption*       string
             +--ro boot-file-url-option! {boot-file-url-op}?
             |  +--ro boot-file* [boot-file-id]
             |     +--ro boot-file-id          uint8
             |     +--ro suitable-arch-type*   uint16
             |     +--ro suitable-net-if*      uint32
             |     +--ro boot-file-url         string
             +--ro boot-file-param-option! {boot-file-param-op}?
             |  +--ro boot-file-paras* [para-id]
             |     +--ro para-id      uint8
             |     +--ro parameter    string
             +--ro aftr-name-option! {aftr-name-op}?
             |  +--ro tunnel-endpoint-name    string
             +--ro kbr-default-name-option! {kbr-default-name-op}?
             |  +--ro default-realm-name    string
             +--ro kbr-kdc-option! {kbr-kdc-op}?
             |  +--ro kdc-info* [kdc-id]
             |     +--ro kdc-id            uint8
             |     +--ro priority          uint16
             |     +--ro weight            uint16
             |     +--ro transport-type    uint8
             |     +--ro port-number       uint16
             |     +--ro kdc-ipv6-addr     inet:ipv6-address
             |     +--ro realm-name        string
             +--ro sol-max-rt-option! {sol-max-rt-op}?
             |  +--ro sol-max-rt-value    yang:timeticks
             +--ro inf-max-rt-option! {inf-max-rt-op}?
             |  +--ro inf-max-rt-value    yang:timeticks
             +--ro addr-selection-option! {addr-selection-op}?
             |  +--ro a-bit-set       boolean
             |  +--ro p-bit-set       boolean
             |  +--ro policy-table* [policy-id]
             |     +--ro policy-id     uint8
             |
      +--n     +--ro label         uint8
             |     +--ro precedence    uint8
             |     +--ro prefix-len    uint8
             |     +--ro prefix        inet:ipv6-prefix
             +--ro pcp-server-option! {pcp-server-op}?
             |  +--ro pcp-server* [pcp-serv-id]
             |     +--ro pcp-serv-id      uint8
             |     +--ro pcp-serv-addr    inet:ipv6-address
             +--ro s46-rule-option! {s46-rule-op}?
             |  +--ro s46-rule* [rule-id]
             |     +--ro rule-id           uint8
             |     +--ro rule-type         enumeration
             |     +--ro prefix4-len       uint8
             |     +--ro ipv4-prefix       inet:ipv4-prefix
             |     +--ro prefix6-len       uint8
             |     +--ro ipv6-prefix       inet:ipv6-prefix
             |     +--ro port-parameter
             |        +--ro offset      uint8
             |        +--ro psid-len    uint8
             |        +--ro psid        uint16
             +--ro s46-br-option! {s46-br-op}?
             |  +--ro br* [br-id]
             |     +--ro br-id           uint8
             |     +--ro br-ipv6-addr    inet:ipv6-address
             +--ro s46-dmr-option! {s46-dmr-op}?
             |  +--ro dmr* [dmr-id]
             |     +--ro dmr-id             uint8
             |     +--ro dmr-prefix-len     uint8
             |     +--ro dmr-ipv6-prefix    inet:ipv6-prefix
             +--ro s46-v4-v6-binding-option! {s46-v4-v6-binding-op}?
                +--ro ce* [ce-id]
                   +--ro ce-id               uint8
                   +--ro ipv4-addr           inet:ipv4-address
                   +--ro bind-prefix6-len    uint8
                   +--ro bind-ipv6-prefix    inet:ipv6-prefix
                   +--ro port-parameter
                      +--ro offset      uint8
                      +--ro psid-len    uint8
                      +--ro psid        uint16

  notifications:
    +---n notifications
         +--n dhcpv6-server-event
       +--ro dhcpv6-client-event
          +--ro ia-lease-event
          |  +--ro event-type     enumeration
          |  +--ro duid
          |  |  +--ro type-code?                   uint16
          |  |  +--ro (duid-type)?
          |  |     +--:(duid-llt)
          |  |     |  +--ro duid-llt-hardware-type?      uint16
          |  |     |  +--ro duid-llt-time?               yang:timeticks
          |  |     |  +--ro duid-llt-link-layer-addr?    yang:mac-address
          |  |     +--:(duid-en)
          |  |     |  +--ro duid-en-enterprise-number?   uint32
          |  |     |  +--ro duid-en-identifier?          string
          |  |     +--:(duid-ll)
          |  |     |  +--ro duid-ll-hardware-type?       uint16
          |  |     |  +--ro duid-ll-link-layer-addr?     yang:mac-address
          |  |     +--:(duid-uuid)
          |  |     |  +--ro uuid?                        yang:uuid
          |  |     +--:(duid-invalid)
          |  |        +--ro data?                        binary
          |  +--ro iaid           uint32
          |  +--ro serv-name?     string
          |  +--ro description?   string
          +--ro invalid-ia-detected
          |  +--ro duid
          |  |  +--ro type-code?                   uint16
          |  |  +--ro (duid-type)?
          |  |     +--:(duid-llt)
          |  |     |  +--ro duid-llt-hardware-type?      uint16
          |  |     |  +--ro duid-llt-time?               yang:timeticks
          |  |     |  +--ro duid-llt-link-layer-addr?    yang:mac-address
          |  +--n pool-running-out  |     +--:(duid-en)
          |  +--ro utilization-ratio            uint16  |     |  +--ro duid                         duidtype duid-en-enterprise-number?   uint32
          |  |     |  +--ro serv-name? duid-en-identifier?          string
          |  |  +--ro pool-name                    string     +--:(duid-ll)
          |  +--n invalid-client-detected  |     +--ro duid                         duidtype     |  +--ro description?                 string
         +--n dhcpv6-relay-event duid-ll-hardware-type?       uint16
          |  +--n topo-changed  |     +--ro relay-if-name                string     |  +--ro first-hop                    boolean duid-ll-link-layer-addr?     yang:mac-address
          |  |     +--:(duid-uuid)
          |  |     |  +--ro last-entity-addr             inet:ipv6-address
         +--n dhcpv6-client-event
            +--n ia-lease-event uuid?                        yang:uuid
          |  |     +--:(duid-invalid)
          |  |        +--ro event-type                   enumeration data?                        binary
          |  +--ro duid                         duidtype cli-duid       uint32
          |  +--ro iaid           uint32
          |  +--ro serv-name?     string
          |  +--ro description?   string
            +--n invalid-ia-detected
          +--ro retransmission-failed
          |  +--ro duid                         duidtype
          |  |  +--ro iaid type-code?                   uint16
          |  |  +--ro (duid-type)?
          |  |     +--:(duid-llt)
          |  |     |  +--ro duid-llt-hardware-type?      uint16
          |  |     |  +--ro duid-llt-time?               yang:timeticks
          |  |     |  +--ro duid-llt-link-layer-addr?    yang:mac-address
          |  |     +--:(duid-en)
          |  |     |  +--ro duid-en-enterprise-number?   uint32
          |  |     |  +--ro serv-name? duid-en-identifier?          string
          |  |     +--:(duid-ll)
          |  |     |  +--ro description?                 string
            +--n retransmission-failed duid-ll-hardware-type?       uint16
          |  |     |  +--ro duid                         duidtype duid-ll-link-layer-addr?     yang:mac-address
          |  |     +--:(duid-uuid)
          |  |     |  +--ro uuid?                        yang:uuid
          |  |     +--:(duid-invalid)
          |  |        +--ro data?                        binary
          |  +--ro description    enumeration
            +--n
          +--ro failed-status-turn-up
             +--ro duid                         duidtype
             |  +--ro type-code?                   uint16
             |  +--ro (duid-type)?
             |     +--:(duid-llt)
             |     |  +--ro duid-llt-hardware-type?      uint16
             |     |  +--ro duid-llt-time?               yang:timeticks
             |     |  +--ro duid-llt-link-layer-addr?    yang:mac-address
             |     +--:(duid-en)
             |     |  +--ro duid-en-enterprise-number?   uint32
             |     |  +--ro duid-en-identifier?          string
             |     +--:(duid-ll)
             |     |  +--ro duid-ll-hardware-type?       uint16
             |     |  +--ro duid-ll-link-layer-addr?     yang:mac-address
             |     +--:(duid-uuid)
             |     |  +--ro uuid?                        yang:uuid
             |     +--:(duid-invalid)
             |        +--ro data?                        binary
             +--ro status-code    enumeration

   Information about notifications:

   Introduction of important nodes:

   o  pool-running-out: raised when  client-config: This container includes the address/prefix pool is going to
      run out.  A threshold for utilization ratio configuration data of
      the pool has been
      defined in the server feature so that client.

   o  client-if: A client may have several interfaces, it will notify the
      administrator when the utilization ratio reaches is more
      reasonable to configure and manage parameters on the threshold, interface-
      level.  The list defines a specific client interface and such threshold its data.
      Different interfaces are distinguished by the "ifName" key which
      is a settable parameter. configurable string value.

   o  invalid-client-detected: raised when the  duid: Each server has found a and client
      which can be regarded as a potential attacker.  Some description
      could also has only one DUID (DHCP Unique
      Identifier).  The DUID here will be included.

   o  topo-changed: raised when the topology of the relay agent is
      changed.

   o  ia-lease-event: raised when carried in the client was allocated Client ID
      option to identify a new IA from specific DHCPv6 client.  This leaf are same
      as the server or it renew/rebind/release its current IA. "duid" leaf in "dhcpv6-server" feature.

   o  invalid-ia-detected: raised when the identity association of  pd-function: Whether the client can be proved act as a requesting router to be invalid.  Possible condition includes
      duplicated address, illegal address, etc.

   o  retransmission-failed: raised when the retransmission mechanism
      defined in [RFC3315] is failed.
      request prefixes using prefix delegation ([RFC3633]).

   o  failed-status-turn-up: raised when the  rapid-commit: '1' indicates a client receives can initiate a Solicit-Reply
      message
      includes an unsuccessful Status Code option.

3.  DHCPv6 YANG Model

   This module imports typedefs from [RFC6991].

<CODE BEGINS> file "ietf-dhcpv6@2017-10-26.yang"
  module ietf-dhcpv6 {
    namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6";
    prefix "dhcpv6";

    import ietf-inet-types {
      prefix inet;
      revision-date "2013-07-15";
    }
    import ietf-yang-types {
      prefix yang;
      revision-date "2013-07-15";
    }

    organization "dhc wg";
    contact "yong@csnet1.cs.tsinghua.edu.cn
      wangh13@mails.tsinghua.edu.cn
      lh.sunlinh@gmail.com
      Ted.Lemon@nominum.com
      ian.farrer@telekom.de
      sladjana.zechlin@telekom.de";

    description "This model defines exchange by adding a YANG data model that can be
      used Rapid Commit option in Solicit
      message.  '0' means the client is not allowed to configure and manage add a Rapid
      Commit option to request addresses in a two-message exchange
      pattern.

   o  mo-tab: The management tab label indicates the operation mode of
      the DHCPv6 server, client. 'm'=1 and 'o'=1 indicate the client will use
      DHCPv6 relay to obtain all the configuration data. 'm'=1 and
      DHCPv6 client.";

    revision 2017-10-26 {
      description "version09: resolve feedbacks from IETF96";
      reference "I-D: draft-ietf-dhc-dhcpv6-yang-04";
    }

    revision 2016-06-18 {
      description "version08: resolve yang compiling error:
        top-level node must not be mandatory, wait for YANG
        doctor's review";

      reference "I-D: draft-ietf-dhc-dhcpv6-yang-03";
    }
    revision 2016-06-15 {
      description "version07: resolve yang compiling errors, wait
        for YANG doctor's review";

      reference "I-D: draft-ietf-dhc-dhcpv6-yang-02";
    }
    revision 2016-03-21 {
      description "version06: resolve feedbacks from IETF94";

      reference "I-D: draft-ietf-dhc-dhcpv6-yang-01";
    }
    revision 2015-10-16 {
      description "version05: Omit 'o'=0 are a
      meaningless combination. 'm'=0 and 'o'=1 indicate the feature statement. Modify
        model according client will
      use stateless DHCPv6 to comments obtain configuration data apart from Huawei. Also correct some
        grammar errors.";

      reference "I-D: draft-ietf-dhc-dhcpv6-yang-00";
    }
    revision 2015-09-25 {
      description "version04: Correct duid
      addresses/prefixes data. 'm'=0 and grammar errors.";

      reference "I-D: draft-cui-dhc-dhcpv6-yang-04";
    }
    revision 2015-07-01 {
      description "version03: Correct grammar errors.";

      reference "I-D: draft-cui-dhc-dhcpv6-yang-03";
    }
    revision 2015-04-13 {
      description "version02: Correct grammar errors.";

      reference "I-D: draft-cui-dhc-dhcpv6-yang-02";
    }
    revision 2015-04-02 {
      description "version01: Correct grammar errors, Reuse
        groupings, Update 'dhcpv6-relay' feature, Add
        notifications.";

      reference "I-D: draft-cui-dhc-dhcpv6-yang-01";
    }
    revision 2015-03-04 {
      description "version00: Initial revision.";

      reference "I-D: draft-cui-dhc-dhcpv6-yang-00";
    }

    /*
     * Typedef
     */

    typedef threshold {
      type union {
        type uint16 {
          range 0..100;
        }
        type enumeration {
          enum "disabled" {
            description "No threshold";
          }
        }
      }
      description "Threshold value in percent";
    }

    /*
     * Grouping
     */

    grouping vendor-infor {
      description "Vendor information.";
      container vendor-info {
        description "";
        leaf ent-num {
          type uint32;
          mandatory true;
          description "enterprise number";
        }
        leaf-list data {
          type string;
          description "specific vendor info";
        }
      }
    }

    grouping duid {
      description "DHCP Unique Identifier";
      reference "RFC3315: Section 9";
      choice duid-type {
        description "Selects 'o'=0 represent the format for client will
      not use DHCPv6 but use SLAAC to achieve configuration.

   o  client-configured-options: Similar to the DUID.";
        case duid-llt {
          description "DUID Based on Link-layer Address Plus Time";
          reference "RFC3315 Section 9.2";
          leaf duid-llt-hardware-type {
            type uint16;
            description "Hardware type as assigned by IANA (RFC826).";
          }
          leaf duid-llt-time {
            type yang:timeticks;
            description "The time value is server, the client also
      need to configure some options to fulfil some desired functions.
      This container include all the time potential options that the DUID is generated
              represented in seconds since midnight (UTC), January 1, 2000,
                          modulo 2^32.";
          }
          leaf duid-llt-link-layer-addr {
            type yang:mac-address;
            description "Link-layer address as described in RFC2464";
          }
        }
        case duid-en {
          description "DUID Assigned by Vendor Based on Enterprise Number";
          reference "RFC3315 Section 9.3";
          leaf duid-en-enterprise-number {
            type uint32;
            description "Vendor's registered Private Enterprise Number as
              maintained by IANA";
          }
          leaf duid-en-identifier {
            type string;
            description "Indentifier, unique need to be
      configured at the device client side.  The relevant RFCs that is using it";
          }
        }
        case duid-ll {
          description "DUID Based on Link-layer Address";
          reference "RFC3315 Section 9.4";
          leaf duid-ll-hardware-type {
            type uint16;
            description "Hardware type as assigned by IANA (RFC826).";
          }
          leaf duid-ll-time {
            type yang:timeticks;
            description "The time value is define
      those options include: [RFC3315], [RFC4704], [RFC5970], [RFC6784],
      [RFC6939].

   o  option-request-option: This container provide a way to configure
      the time list of options that the DUID is generated
              represented client will request in seconds since midnight (UTC), January 1, 2000,
                          modulo 2^32.";
          }
        }

      }
    }

    grouping portset-para {
      description "portset parameters"; its ORO
      option.

   o  client-state: This 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 includes the state data of a psid";
        }
        leaf psid {
          type uint16;
          mandatory true;
          description "psid value";
        }
      }
    }

    /*
     * Data Nodes
     */ the
      client.

   o  if-other-paras: A client can obtain extra configuration data other
      than address and prefix information through DHCPv6 options.  This
      container describes such data the client was configured through
      DHCPv6.  The potential configuration data may include DNS server {
      presence "Enables server";
      description "dhcpv6
      parameters, SIP server portion";
      container serv-attributes {
        description "This parameters and etc.

   o  packet-stats: A container contains basic attributes records all the packet status
      information of a DHCPv6 server such as DUID, specific interface.

   Information about notifications:

   o  ia-lease-event: raised when the client was allocated a new IA from
      the server name and so
          on. Some optional functions that or it renew/rebind/release its current IA.

   o  invalid-ia-detected: raised when the identity association of the
      client can be provided by proved to be invalid.  Possible condition includes
      duplicated address, illegal address, etc.

   o  retransmission-failed: raised when the server retransmission mechanism
      defined in [RFC3315] is also included.";
        leaf name failed.

   o  failed-status-turn-up: raised when the client receives a message
      includes an unsuccessful Status Code option.

3.  DHCPv6 YANG Model

3.1.  DHCPv6 Server YANG Model

   This module imports typedefs from [RFC6991].

<CODE BEGINS> file "ietf-dhcpv6-server@2017-12-22.yang"
module ietf-dhcpv6-server {
          type string;
          description "server's name";
        }
        container duid
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-server";
  prefix "dhcpv6-server";

  import ietf-inet-types {
          description "Sets the DUID";
          uses duid;
    prefix inet;
    revision-date "2013-07-15";
  }
        leaf-list ipv6-address
  import ietf-yang-types {
          type inet:ipv6-address;
          description "Server's IPv6 address.";
    prefix yang;
    revision-date "2013-07-15";
  }
        leaf description
  import ietf-dhcpv6-options {
          type string;
          description "Description of the server.";
    prefix dhcpv6-options;
    revision-date "2017-12-22";
  }
        leaf pd-function {
          type boolean;
          mandatory true;

  organization "DHC WG";
  contact "yong@csnet1.cs.tsinghua.edu.cn
    lh.sunlinh@gmail.com
    ian.farrer@telekom.de
    sladjana.zechlin@telekom.de
    hezihao9512@gmail.com";

  description "Whether the server can act as "This model defines a
            delegating router YANG data model that can be
    used to perform prefix delegation
            ([RFC3633])."; configure and manage a DHCPv6 server.";

  revision 2017-12-22 {
    description "Resolve most issues on Ian's github.";
    reference "I-D: draft-ietf-dhc-dhcpv6-yang";
  }
        leaf stateless-service

  revision 2017-11-24 {
          type boolean;
          mandatory true;
    description "A boolean value specifies whether "First version of the separated server support client-server exchanges
            involving two messages defined in ([RFC3315])."; specific
      YANG model.";
    reference "I-D: draft-ietf-dhc-dhcpv6-yang";
  }
        leaf rapid-commit

  /*
   * Typedef
   */

  typedef threshold {
    type boolean;
          mandatory true;
          description "A boolean value specifies whether
            the server support client-server exchanges
            involving two messages defined in ([RFC3315]).";
        }
        leaf-list interfaces-config union {
      type string; uint16 {
        range 0..100;
      }
      type enumeration {
        enum "disabled" {
          description "A leaf list to denote which one or
            more interfaces the server should listen on. The
            default value 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'."; "No threshold";
        }
      }
        uses vendor-infor;
    }
      container option-sets {
    description "DHCPv6 employs various options to carry
          additional information and parameters "Threshold value in DHCP messages.
          This percent";
  }

  /*
   * Grouping
   */

  grouping vendor-infor {
   description "Vendor information.";
   container defines all the possible options that
          need to be configured at the server side.";
        list option-set vendor-info {
          key option-set-id;
     description "A server may allow different option
            sets to be configured for different conditions
            (i.e. different networks, clients and etc). This
            'option-set' list enables various sets of options
            being defined and configured in a single server.
            Different sets are distinguished by the key called
            'option-set-id'. All the possible options discussed
            above are defined in the list and each option is
            corresponding to a container."; "";
     leaf option-set-id ent-num {
       type uint8; uint32;
       mandatory true;
       description "the option-set-id key"; "enterprise number";
     }
          list new-or-standard-option
     leaf-list data {
            key option-code;
       type string;
       description "new or standard option"; "specific vendor info";
     }
   }
  }

  grouping duid {
      description "DHCP Unique Identifier";
      reference "RFC3315: Section 9 and RFC6355: Section 4";
      leaf option-code type-code {
        type uint16;
              mandatory true;
        default 65535;
        description "the option "Type code key"; of this DUID";
      }
      choice duid-type {
      default duid-invalid;
        description "Selects the format for the DUID.";
        case duid-llt {
          description "DUID Based on Link-layer Address Plus Time (Type 1 - DUID-LLT)";
          reference "RFC3315 Section 9.2";
          leaf option-name duid-llt-hardware-type {
            type string;
              mandatory true; uint16;
            description "the new option's name"; "Hardware type as assigned by IANA (RFC826).";
          }
          leaf option-description duid-llt-time {
            type string;
              mandatory true; yang:timeticks;
            description "description of new option"; "The time value is the time that the DUID is generated
              represented in seconds since midnight (UTC), January 1, 2000,
              modulo 2^32.";
          }
          leaf option-reference duid-llt-link-layer-addr {
            type string; yang:mac-address;
            description "reference to the
                specification"; "Link-layer address as described in RFC2464";
          }
        }
        case duid-en {
          description "DUID Assigned by Vendor Based on Enterprise Number (Type 2 - DUID-EN)";
          reference "RFC3315 Section 9.3";
          leaf option-value duid-en-enterprise-number {
            type uint32;
            description "Vendor's registered Private Enterprise Number as
              maintained by IANA";
          }
          leaf duid-en-identifier {
            type string;
              mandatory true;
            description "the new option's value"; "Indentifier, unique to the device that is using it";
          }
        }
        case duid-ll {
          description "DUID Based on Link-layer Address (Type 3 - DUID-LL)";
          reference "RFC3315 Section 9.4";
          leaf user-class-value duid-ll-hardware-type {
            type string; uint16;
            description "use class option's value"; "Hardware type as assigned by IANA (RFC826).";
          }
          leaf enterprise-number duid-ll-link-layer-addr {
              type uint32; yang:mac-address;
              description "enterprise number"; "Link-layer address as described in RFC2464";
        }
        }
        case duid-uuid {
          description "DUID Based on Universally Unique Identifier (Type 4 - DUID-UUID)";
          reference "RFC6335 Defination of the UUID-Based Unique Identifier";
          leaf store-client-link-layer uuid {
            type boolean; yang:uuid;
            description "whether to store client's
              link layer address"; "A Universally Unique IDentifier in the string representation
                defined in RFC 4122.  The canonical representation uses
                lowercase characters";
          }
          container preference-option
        }
        case duid-invalid {
          description "preference option"; "DUID based on free raw bytes";
          leaf enable data {
            type boolean;
              mandatory true; binary;
            description "indicate whether this option will "The bits to be included in used as the
                option set"; identifier";
          }
        }
            leaf preference-value {
              type uint8;
              mandatory true;
              description "the value for this option";
      }
    }

  /*
   * Data Nodes
   */

  container sip-server-option server {
    presence "Enables the server";
    description "sip "DHCPv6 server option";
            //Note - this portion";
    /*
     * Configuration data
     */
    container is currently modelling two options (21 & 22). It would allow the
            //config server-config {
      description "configuration tree of a mixed list server";
         container serv-attributes {
            description "This container contains basic attributes
              of domain names and addresses in a way DHCPv6 server such as IPv6 address, server name
              and so on. Some optional functions that doesn't follow the
            //RFC. Needs to can be broken into SIP Domain list and SIP Address list containers
            reference "RFC3319: Dynamic Host Configuration Protocol
              (DHCPv6) Options for Session Initiation Protocol (SIP)
              Servers"; provided
              by 0the server is also included.";
            leaf enable name {
              type boolean;
              mandatory true; string;
              description "indicate whether this
                option will be included in the
                option set"; "server's name";
            }
            list sip-server
            container duid {
              key sip-serv-id;
              description "sip server info";
              leaf sip-serv-id "Sets the DUID";
              uses duid;
            }
            leaf-list ipv6-address {
              type uint8;
                mandatory true; inet:ipv6-address;
              description "sip server id"; "Server's IPv6 address.";
            }
            leaf sip-serv-domain-name description {
              type string;
                mandatory true;
              description "sip server domain
                  name"; "Description of the server.";
            }
            leaf sip-serv-addr pd-function {
              type inet:ipv6-address; boolean;
              mandatory true;
              description "sip "Whether the server addr";
              }
            } can act as a
                delegating router to perform prefix delegation
                ([RFC3633]).";
            }
          container dns-config-option {
            description "OPTION_DNS_SERVERS (23) DNS recursive Name
              Server option";
            reference "RFC3646: DNS Configuration options for Dynamic
              Host Configuration Protocol for IPv6 (DHCPv6)";
            leaf enable stateless-service {
              type boolean;
              mandatory true;
              description "indicate "A boolean value specifies whether this
                option will be included
                the server support client-server exchanges
                involving two messages defined in the
                option set"; ([RFC3315]).";
            }
            list dns-server {
              key dns-serv-id;
              description "dns server info";
            leaf dns-serv-id rapid-commit {
              type uint8; boolean;
              mandatory true;
              description "DNS "A boolean value specifies whether
                the server list entry ID."; support client-server exchanges
                involving two messages defined in ([RFC3315]).";
            }
              leaf dns-serv-addr
            leaf-list interfaces-config {
              // Note - this should probably be references to
              // entries in the ietf-interfaces model
              type inet:ipv6-address;
                mandatory true; string;
              description "DNS "A leaf list to denote which one or
                more interfaces the server address.";
              } should listen on. The
                default value 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'.";
            }
            uses vendor-infor;
          }

          container domain-searchlist-option option-sets {
            description "OPTION_DOMAIN_LIST (24) Domain Search List Option";
            reference "RFC3646: DNS Configuration "DHCPv6 employs various options for Dynamic
              Host Configuration Protocol for IPv6 (DHCPv6)";
            leaf enable to carry additional
                  information and parameters in DHCP messages. This container defines
                  all the possible options that need to be configured at the server
                  side. ";
              list option-set {
              type boolean;
              mandatory true;
                  key id;
                description "indicate "A server may allow different option sets to be
                    configured for different conditions (i.e. different networks,
                    clients and etc). This 'option-set' list enables various sets of
                    options being defined and configured in a single server. Different
                    sets are distinguished by the key called 'option-set-id'. All the
                    possible options discussed above are defined in the list and each
                    option is corresponding to a container. Since all the options in
                    the list are optional, each container in this list has a 'presence'
                    statement to indicate whether this option (container) will be
                    included in the current option set";
            }
            list domain-searchlist {
              key domain-searchlist-id;
              description "dns set or not. In addition, each container
                    also has a 'if-feature' statement to indicate whether the server info";
              leaf domain-searchlist-id {
                type uint8;
                mandatory true;
                description "Domain seachlist entry ID.";
              }
                    supports this option (container).";
                  leaf domain-search-list-entry id {
                    type string;
                mandatory true; uint32;
                    description "Domain search list entry."; "option set id";
                  }
                uses dhcpv6-options:server-option-definitions;
                uses dhcpv6-options:custom-option-definitions;
              }
            }

            container nis-config-option {
            description "OPTION_NIS_SERVERS (27) Network Information Service (NIS)
              Servers Option.";
            reference "RFC3989: Network Information Service (NIS) Configuration
              Options for Dynamic Host Configuration Protocol for IPv6 (DHCPv6)";
            leaf enable network-ranges {
              type boolean;
              mandatory true;
              description "indicate whether "This model supports a hierarchy
                to achieve dynamic configuration. That is to
                say we could configure the server at different
                levels through this
                option will model. The top level is a
                global level which is defined as the container
                '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 included in allocated to
                all the
                option set";
            } clients served by this server.";
              list nis-server network-range {
                key nis-serv-id;
              description "nis server info";
              leaf nis-serv-id {
                type uint8;
                mandatory true;
                description "nis server id";
              }
              leaf nis-serv-addr {
                type inet:ipv6-address;
                mandatory true; network-range-id;
                description "nis "Under the 'network-ranges'
                  container, a 'network-range' list is
                  defined to configure the server addr";
              }
            }
          }
          container nis-plus-config-option {
            description "OPTION_NISP_SERVERS (28): Network Information Service V2
              (NIS+) Servers Option.";
            reference "RFC3989: Network Information Service (NIS) Configuration
              Options for Dynamic Host Configuration Protocol 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 IPv6 (DHCPv6)"; different networks.";
                leaf enable network-range-id {
                  type boolean; uint32;
                  mandatory true;
                  description "indicate whether this
                option will be included in the
                option set"; "equivalent to subnet id";
                }
            list nis-plus-server {
              key nis-plus-serv-id;
              description "NIS+ server information.";
                leaf nis-plus-serv-id network-description {
                  type uint8; string;
                  mandatory true;
                  description "nisp server id"; "description of the subnet";
                }
                leaf nis-plus-serv-addr network-prefix {
                  type inet:ipv6-address; inet:ipv6-prefix;
                  mandatory true;
                  description "nisp server addr";
              }
            } "subnet prefix";
                }
          container sntp-server-option {
            description "OPTION_SNTP_SERVERS (31) Simple Network Time Protocol
              (SNTP) Servers Option";
            reference "RFC4075: Simple Network Time Protocol (SNTP) Configuration
              Option for DHCPv6";
                leaf enable inherit-option-set {
                  type boolean;
                  mandatory true;
                  description "indicate whether this
                option will be included in to inherit
                    the
                option set"; configuration from higher level";
                }
                leaf option-set-id {
                  type leafref {
                    path "/server/server-config/option-sets/option-set/id";

                  }
                  description "The ID field of relevant option-set to be
                    provisioned to clients of this network-range.";
                }

                container reserved-addresses {
                  description "reserved addresses";
                  list sntp-server static-binding {
                    key sntp-serv-id; cli-id;
                    description "sntp server info"; "static binding of
                      reserved addresses";
                    leaf sntp-serv-id cli-id {
                      type uint8; uint32;
                      mandatory true;
                      description "sntp server "client id";
                    }
              leaf sntp-serv-addr
                    container duid {
                      description "Sets the DUID";
                      uses duid;
                    }
                    leaf-list reserv-addr {
                      type inet:ipv6-address;
                mandatory true;
                      description "sntp server "reserved addr";
                    }
                  }
                  leaf-list other-reserv-addr {
                    type inet:ipv6-address;
                    description "other reserved
                      addr";
                  }
                }

                container info-refresh-time-option reserved-prefixes {
                  description "OPTION_INFORMATION_REFRESH_TIME (32) Information Refresh
              Time option.";
            reference "RFC4242: Information Refresh Time Option for Dynamic Host
              Configuration Protocol for IPv6 (DHCPv6"; "reserved prefixes";
                  list static-binding {
                    key cli-id;
                    description "static binding";
                    leaf enable cli-id {
                      type boolean; uint32;
                      mandatory true;
                      description "indicate whether this
               option will be included in "client id";
                    }
                    container duid {
                      description "Sets the
               option set"; DUID";
                      uses duid;
                    }
                    leaf info-refresh-time reserv-prefix-len {
                      type uint8;
                      mandatory true;
                      description "reserved
                        prefix length";
                    }
                    leaf reserv-prefix {
                      type yang:timeticks; inet:ipv6-prefix;
                      mandatory true;
                      description "The refresh time.";
                        "reserved prefix";
                    }
                  }
          container cli-fqdn-option
                  leaf exclude-prefix-len {
                    type uint8;
                    mandatory true;
                    description "OPTION_CLIENT_FQDN (39) DHCPv6 Client FQDN Option";
            reference "RFC4704: The Dynamic Host Configuration Protocol for IPv6
              (DHCPv6) Client Fully Qualified Domain Name (FQDN) Option"; "exclude prefix
                      length";
                  }
                  leaf enable exclude-prefix {
                    type boolean; inet:ipv6-prefix;
                    mandatory true;
                    description "indicate whether this option will be included in the
                option set"; "exclude prefix";
                  }
                  list other-reserv-prefix {
                    key reserv-id;
                    description
                      "other reserved prefix";
                    leaf server-initiate-update reserv-id {
                      type boolean; uint32;
                      mandatory true;
                      description "server initiate";
                        "reserved prefix id";
                    }
                    leaf client-initiate-update prefix-len {
                      type boolean; uint8;
                      mandatory true;
                      description "client initiate"; "prefix length";
                    }
                    leaf modify-name-from-cli prefix {
                      type boolean; inet:ipv6-prefix;
                      mandatory true;
                      description "modify by client";
                        "reserved prefix";
                    }
                  }
                }

                container posix-timezone-option address-pools {
                  description "OPTION_NEW_POSIX_TIMEZONE (41) Posix Timezone option";
            reference "RFC4822: Timezone Options for DHCP";
            leaf enable "A container that describes
                    the DHCPv6 server's address pools.";
                  list address-pool {
              type boolean;
              mandatory true;
                    key pool-id;
                    description "indicate whether this option will "A DHCPv6 server can
                      be included in configured with several address
                      pools. This list defines such
                      address pools which are distinguished
                      by the
                        option set";
            } key called 'pool-name'.";
                    leaf tz-posix pool-id {
                      type string; uint32;
                      mandatory true;
                      description "TZ Posix IEEE 1003.1 String";
            } "pool id";
                    }
          container posix-timezone-db-option {
            description "OPTION_NEW_TZDB_TIMEZONE (42) Timezone Database option";
            reference "RFC4822: Timezone Options for DHCP";
                    leaf enable pool-prefix {
                      type boolean; inet:ipv6-prefix;
                      mandatory true;
                      description "indicate whether this option will be included in the
                        option set"; "pool prefix";
                    }
                    leaf tz-database start-address {
                      type string; inet:ipv6-address-no-zone;
                      mandatory true;
                      description "Reference to the TZ Database";
            } "start address";
                    }
          container ntp-server-option
                    leaf end-address {
            //This option looks like it needs work to correctly model the
            //option as defined in the RFC.
            description "OPTION_NTP_SERVER (56) NTP Server Option for DHCPv6";
            reference "RFC5908: Network Time Protocol (NTP) Server Option for
            DHCPv6";
                      type inet:ipv6-address-no-zone;
                      mandatory true;
                      description "end address";
                    }
                    leaf enable renew-time {
                      type boolean; yang:timeticks;
                      mandatory true;
                      description "indicate whether this option will be included in the
                        option set"; "renew time";
                    }
            list ntp-server {
              key ntp-serv-id;
              description "ntp server info";
                    leaf ntp-serv-id rebind-time {
                      type uint8; yang:timeticks;
                      mandatory true;
                      description "ntp server id"; "rebind time";
                    }
                    leaf ntp-serv-addr-suboption preferred-lifetime {
                      type inet:ipv6-address; yang:timeticks;
                      mandatory true;
                      description "ntp server addr"; "preferred lifetime
                        for IA";
                    }
                    leaf ntp-serv-mul-addr-suboption valid-lifetime {
                      type inet:ipv6-address; yang:timeticks;
                      mandatory true;
                      description "ntp server multicast addr"; "valid liftime for IA";
                    }
                    leaf ntp-serv-fqdn-suboption max-address-utilization-ratio {
                      type string; threshold;
                      mandatory true;
                      description "ntp server fqdn";
              }
            } "address pool utilization ratio threshold";
                    }
          container network-boot-option {
            description "network boot option";
                    leaf enable inherit-option-set {
                      type boolean;
                      mandatory true;
                      description "indicate whether this
                option will be included in to
                        inherit the
                option set"; configuration from
                        higher level";
                    }
            list boot-file {
              key boot-file-id;
              description "boot file info";
                    leaf boot-file-id option-set-id {
                      type uint8; leafref {
                        path "/server/server-config/option-sets/option-set/id";
                      }
                      mandatory true;
                      description "boot file id"; "The ID field of relevant option-set to be
                        provisioned to clients of this address-pool.";
                    }
              leaf-list suitable-arch-type
                }
              }

                container prefix-pools {
                type uint16;
                    description "architecture type";
              }
              leaf-list suitable-net-if "If a server supports prefix
                      delegation function, this container will
                      be used to define the delegating router's
                      refix pools.";
                    list prefix-pool {
                      key pool-id;
                      description "Similar to server's
                        address pools, a delegating router
                        can also be configured with multiple
                        prefix pools specified by a list
                        called 'prefix-pool'.";
                      leaf pool-id {
                        type uint32;
                        mandatory true;
                        description "network interface"; "pool id";
                      }
                      leaf boot-file-url prefix {
                        type string; inet:ipv6-prefix;
                        mandatory true;
                        description "url for boot file"; "ipv6 prefix";
                      }
              list boot-file-paras {
                key para-id;
                description "boot file parameters";
                      leaf para-id prefix-length {
                        type uint8;
                        mandatory true;
                        description "parameter id"; "prefix length";
                      }
                      leaf parameter renew-time {
                        type string; yang:timeticks;
                        mandatory true;
                        description "parameter
                    value";
                }
              }
            } "renew time";
                      }
          container aftr-name-option
                      leaf rebind-time {
                        type yang:timeticks;
                        mandatory true;
                        description "OPTION_AFTR_NAME (64) AFTR-Name DHCPv6 Option";
            reference "RFC6334: Dynamic Host Configuration Protocol for IPv6
            (DHCPv6) Option for Dual-Stack Lite"; "rebind time";
                      }
                      leaf enable preferred-lifetime {
                        type boolean; yang:timeticks;
                        mandatory true;
                        description "indicate whether this option will be included in the
              option set"; "preferred lifetime for
                          IA";
                      }
                      leaf tunnel-endpoint-name valid-lifetime {
                        type string; yang:timeticks;
                        mandatory true;
                        description "aftr name";
            } "valid lifetime for IA";
                      }
          container kerberos-option
                      leaf max-prefix-utilization-ratio {
            //This needs re-working and possibly splitting into several option
            //containers to follow the RFC.
                        type threshold;
                        mandatory true;
                        description "kerberos option";
            reference "RFC6784: Kerberos Options for DHCPv6"; "prefix pool utilization ratio threshold";
                      }
                      leaf enable inherit-option-set {
                        type boolean;
                        mandatory true;
                        description "indicate whether this
                option will be included in the
                option set"; "whether to inherit
                          configuration from higher level";
                      }
                      leaf default-realm-name option-set-id {
                        type string;
              mandatory true; leafref {
                          path "/server/server-config/option-sets/option-set/id";
                        }
                        description "default realm name"; "The ID field of relevant option-set to be
                          provisioned to clients of this prefix-pool.";
                      }
                    }
                  }
                  container hosts {
                    description "hosts level";
                    list kdc-info host {
                      key kdc-id; cli-id;
                      description "kdc info"; "specific host";
                      leaf kdc-id cli-id {
                        type uint8; uint32;
                        mandatory true;
                        description "kdc "client id";
                      }
                      container duid {
                        description "Sets the DUID";
                        uses duid;
                      }
                      leaf priority inherit-option-set {
                        type uint16; boolean;
                        mandatory true;
                        description "priority"; "whether to inherit
                          configuration
                          from higher level";
                      }
                      leaf weight option-set-id {
                        type uint16;
                mandatory true; leafref {
                          path "/server/server-config/option-sets/option-set/id";
                        }
                        description "weight"; "The ID field of relevant option-set to be
                          provisioned to clients of this prefix-pool.";
                      }
                      leaf transport-type nis-domain-name {
                        type uint8;
                mandatory true; string;
                        description "transport type"; "nis domain name";
                      }
                      leaf port-number nis-plus-domain-name {
                        type uint16;
                mandatory true; string;
                        description "port number"; "nisp domain name";
                      }
                    }
                  }
              }

            }
            container relay-opaque-paras {
              description "This container contains some
                opaque values in Relay Agent options that
                need to be configured on the server side
                only for value match. Such Relay Agent
                options include Interface-Id option,
                Remote-Id option and Subscriber-Id option.";
              list relays {
                key relay-name;
                description "relay agents";
                leaf kdc-ipv6-addr relay-name {
                  type inet:ipv6-address; string;
                  mandatory true;
                  description "kdc ipv6 addr"; "relay agent name";
                }
                list interface-info {
                  key if-name;
                  description "interface info";
                  leaf realm-name if-name {
                    type string;
                    mandatory true;
                    description "realm "interface name";
                  }
            }
          }
          container addr-selection-option {
            description "address selection option";
                  leaf enable interface-id {
                    type boolean; string;
                    mandatory true;
                    description "indicate whether this option will be included in the
                        option set"; "interface id";
                  }
                }
                list subscribers {
                  key subscriber;
                  description "subscribers";
                  leaf a-bit-set subscriber {
                    type boolean; uint32;
                    mandatory true;
                    description "a bit"; "subscriber";
                  }
                  leaf p-bit-set subscriber-id {
                    type boolean; string;
                    mandatory true;
                    description "p bit"; "subscriber id";
                  }
                }
                list policy-table remote-host {
                  key policy-id; ent-num;
                  description "policy table"; "remote host";
                  leaf policy-id ent-num {
                    type uint8; uint32;
                    mandatory true;
                    description "policy id"; "enterprise number";
                  }
                  leaf label remote-id {
                    type uint8; string;
                    mandatory true;
                    description "label"; "remote id";
                  }
                      leaf precedence
                }
              }
            }
            container rsoo-enabled-options {
                        type uint8;
                        mandatory true;
              description "precedence";
                      } "rsoo enabled options";
              list rsoo-enabled-option{
                key option-code;
                description "rsoo enabled option";
                leaf prefix-len option-code {
                  type uint8; uint16;
                  mandatory true;
                  description "prefix length"; "option code";
                }
                leaf prefix description {
                  type inet:ipv6-prefix; string;
                  mandatory true;
                  description "prefix"; "description of the option";
                }
              }
            }

    }

    /*
     * State data
     */
    container sol-max-rt-option { server-state{
      config "false";
      description "OPTION_SOL_MAX_RT (82) sol max rt option";
                    reference "RFC7083: Modification "states of server";
      container network-ranges{
        description "This model supports a hierarchy
              to Default Values achieve dynamic configuration. That is to
              say we could configure the server at different
              levels through this model. The top level is a
              global level which is defined as the container
              '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.";
        list network-range{
          key network-range-id;
          description "The ID field of
                      SOL_MAX_RT and INF_MAX_RT"; relevant option-set to be
                  provisioned to clients of this network-range.";
          leaf enable network-range-id {
            type boolean; uint32;
            mandatory true;
            description "indicate whether this
                        option will be included in the
                        option set"; "equivalent to subnet id";
          }
          container address-pools{
            description "A container that describes
              the DHCPv6 server's address pools";
              list address-pool{
                key pool-id;
                    leaf sol-max-rt-value pool-id {
                        type yang:timeticks; uint32;
                        mandatory true;
                        description "sol max rt value";
                    } "pool id";
                      }
           container inf-max-rt-option {
                description "OPTION_INF_MAX_RT (83) inf max rt option";
                    reference "RFC7083: Modification to Default Values of
                      SOL_MAX_RT and INF_MAX_RT"; "...";
                leaf enable total-ipv6-count {
                  type boolean; uint64;
                  mandatory true;
                  description "indicate whether this
                        option will be included "how many ipv6 addresses
                    are in the
                        option set"; pool";
                }
                leaf inf-max-rt-value used-ipv6-count {
                  type yang:timeticks; uint64;
                  mandatory true;
                  description "inf max rt value"; "how many are allocated";
                }
                leaf address-utilization-ratio {
                  type uint16;
                  mandatory true;
                  description "current address pool utilization ratio";
                }
              }
           container pcp-server-option
              list binding-info {
                key cli-id;
                description "OPTION_V6_PCP_SERVER (86)
                      pcp server option";
                    reference "RFC7291: DHCP Options "A list that records a binding
                  information for the Port Control
                      Protocol (PCP)"; each DHCPv6 client
                  that has already been allocated
                  IPv6 addresses.";
                leaf enable cli-id {
                  type boolean; uint32;
                  mandatory true;
                  description "indicate whether this
                        option will be included in "client id";
                  }
                container duid {
                  description "Read the
                        option set"; DUID";
                  uses duid;
                  }
                list pcp-server { cli-ia{
                  key pcp-serv-id; iaid;
                  description "pcp server info"; "client IA";
                  leaf pcp-serv-id ia-type {
                    type uint8; string;
                    mandatory true;
                    description "pcp server id"; "IA type";
                  }
                  leaf pcp-serv-addr iaid {
                    type inet:ipv6-address; uint32;
                    mandatory true;
                    description "pcp server "IAID";
                  }
                  leaf-list cli-addr {
                    type inet:ipv6-address;
                    description "client addr";
                  }
                  leaf pool-id {
                    type uint32;
                    mandatory true;
                    description "pool id";
                  }
                }
              }
            }
            container s46-rule-option prefix-pools{
              description "If a server supports prefix
                delegation function, this container will
                be used to define the delegating router's
                prefix pools.";
              list prefix-pool {
                key pool-id;
                description "s46 rule option";
                    reference "RFC7598: DHCPv6 Options for Configuration of
                      Softwire Address and Port-Mapped Clients"; "Similar to server's address pools,
                  a delegating router can also be configured with
                  multiple prefix pools specified by a list
                  called 'prefix-pool'.";
                leaf enable pool-id {
                  type boolean; uint32;
                  mandatory true;
                  description "pool id";
                  }
                leaf prefix-utilization-ratio {
                  type uint16;
                  mandatory true;
                  description "indicate whether this
                        option will be included in the
                        option set"; "current prefix pool utilization ratio";
                  }
              }
              list s46-rule binding-info {
                key rule-id; cli-id;
                description "s46 rule"; "A list records a binding information
                for each DHCPv6 client that has already been
                alloated IPv6 addresses.";
                leaf rule-id cli-id {
                  type uint8; uint32;
                  mandatory true;
                  description "rule "client id";
                }
                      leaf rule-type {
                        type enumeration {
                          enum "BMR"
                container duid {
                  description "BMR"; "Reads the DUID";
                  uses duid;
                }
                          enum "FMR"
                list cli-iapd {
                  key iaid;
                  description "FMR";
                          }
                        }
                        mandatory true;
                        description "rule type";
                      } "client IAPD";
                  leaf prefix4-len iaid {
                    type uint8; uint32;
                    mandatory true;
                    description "ipv4 prefix length"; "IAID";
                  }
                      leaf ipv4-prefix
                  leaf-list cli-prefix {
                    type inet:ipv4-prefix;
                        mandatory true; inet:ipv6-prefix;
                    description "ipv4 "client ipv6 prefix";
                  }
                      leaf prefix6-len
                  leaf-list cli-prefix-len {
                    type uint8;
                        mandatory true;
                    description "ipv6 "client prefix length";
                  }
                  leaf ipv6-prefix pool-id {
                    type inet:ipv6-prefix; uint32;
                    mandatory true;
                    description "ipv6 prefix"; "pool id";
                  }
                      uses portset-para;

                }
              }
           container s46-br-option
            }

            list address-prefix-assign-param {
              // Zihao - This probably needs further updated.
              // But is it a way to represent the address/prefix assignment
              // logic?
              key cli-id;
              description "s46 br option";
                    reference "RFC7598: "This list includes some parameters/identifiers
                that the server obtains from DHCPv6 Options for Configuration of
                      Softwire Address and Port-Mapped Clients";
                    leaf enable {
                      type boolean;
                      mandatory true;
                      description "indicate whether options in this
                        option will network-range.
                These identifiers may be included in helpful for the
                        option set";
                    }
                    list br {
                      key br-id;
                      description "br info"; server to assign
                addresses/prefixes.";
              reference "Section 3.12 of RFC7824";
              leaf br-id cli-id {
                type uint8; uint32;
                mandatory true;
                description "br "client id";
              }
              leaf br-ipv6-addr source-ipv6-addr {
                type inet:ipv6-address;
                        mandatory true;
                        description "br ipv6 addr";
                      }
                    }
                  }
          container operator-option-ipv6-address {
            description "operator ipv6 address option";
            reference "RFC7227: Guidelines for Creating New DHCPv6 Options";
            leaf enable {
              type boolean;
              mandatory true;
                description "indicate whether this
                option will be included in "The adrress of the
                option set"; link to which the client
                  is attached.";
              }
            list operator-ipv6-addr
              container duid {
              key operator-ipv6-addr-id;
                  description "operator ipv6 address info";
              leaf operator-ipv6-addr-id "The DUID supplied by the client.";
                  uses duid;
              }
              leaf-list iaid {
                type uint8;
                mandatory true; uint32;
                description "operator ipv6 address id"; "IAID";
              }
              leaf operator-ipv6-addr
              leaf-list preferred-addr {
                type inet:ipv6-address;
                mandatory true;
                description "operator ipv6 "The IPv6 address id";
              }
            } preferred by the client.";
              }
          container operator-option-single-flag
              leaf-list preferred-prefix-len {
                type uint8;
                description "operator single flag";
            reference "RFC7227: Guidelines for Creating New DHCPv6
              Options"; "The prefix length preferred by the client.";
              }
              leaf enable client-fqdn {
                type boolean;
              mandatory true; string;
                description "indicate whether this
                option will be included in "Fully Qualified Domain Name supplied by the
                option set"; client.";
              }
            list flag
              leaf client-link-layer-addr {
              key flag-id;
                type uint16;
                description "operator single flag info"; "Link-layer address supplied by the client.";
              }
              leaf flag-id client-enterprise-number {
                type uint8;
                mandatory true; uint32;
                description "operator single flag id"; "Enterprise number supplied by the client.";
              }
              leaf flag-value{
              leaf-list client-sys-archi-type {
                type boolean;
                mandatory true; uint16;
                description "operator single flag value"; "Supported system architecture type supplied by
                  the client";
              }
            }

                  }

        }

        container operator-option-ipv6-prefix packet-stats {
              description "operator ipv6 prefix option";
            reference "RFC7227: Guidelines for Creating New "A container presents
              the packet statistics related to
              the DHCPv6
              Options"; server.";
            leaf enable solicit-count {
              type boolean; uint32;
              mandatory true;
              description "indicate whether this
                option will be included in the
                option set"; "solicit counter";
            }
            list operator-ipv6-prefix{
              key operator-ipv6-prefix-id;
              description "operator ipv6 prefix info";
            leaf operator-ipv6-prefix-id request-count {
              type uint8;
                mandatory true;
                description "operator ipv6 prefix id";
              }
              leaf operator-ipv6-prefix6-len{
                type uint8; uint32;
              mandatory true;
              description "operator ipv6 prefix length"; "request counter";
            }
            leaf operator-ipv6-prefix renew-count {
              type inet:ipv6-prefix; uint32;
              mandatory true;
              description "operator ipv6 prefix";
              }
            } "renew counter";
            }
          container operator-option-int32 {
            description "operator integer 32 option";
            reference "RFC7227: Guidelines for Creating New DHCPv6
              Options";
            leaf enable rebind-count {
              type boolean; uint32;
              mandatory true;
              description "indicate whether this
                option will be included in the
                option set";
            }
            list int32val{
              key int32val-id;
              description "operator integer 32 info"; "rebind counter";
            }
            leaf int32val-id decline-count {
              type uint8; uint32;
              mandatory true;
              description "operator integer 32 id"; "decline count";
            }
            leaf int32val{ release-count {
              type uint32;
              mandatory true;
              description "operator integer 32 value";
              }
            } "release counter";
            }
          container operator-option-int16 {
            description "operator integer 16 option";
            reference "RFC7227: Guidelines for Creating New DHCPv6
              Options";
            leaf enable info-req-count {
              type boolean; uint32;
              mandatory true;
              description "indicate whether this
                option will be included in the
                option set"; "information request
                counter";
            }
            list int16val{
              key int16val-id;
              description "operator integer 16 info";
            leaf int16val-id advertise-count {
              type uint8; uint32;
              mandatory true;
              description "operator integer 16 id"; "advertise counter";
            }
            leaf int16val{ confirm-count {
              type uint16; uint32;
              mandatory true;
              description "operator integer 16 value";
              }
            } "confirm counter";
            }
          container operator-option-int8
            leaf reply-count {
              type uint32;
              mandatory true;
              description "operator integer 8 option";
            reference "RFC7227: Guidelines for Creating New DHCPv6
              Options"; "reply counter";
            }
            leaf enable reconfigure-count {
              type boolean; uint32;
              mandatory true;
              description "indicate whether this
                option will be included in the
                option set"; "reconfigure counter";

            }
            list int8val{
              key int8val-id;
              description "operator integer 8 info";
            leaf int8val-id relay-forward-count {
              type uint8; uint32;
              mandatory true;
              description "operator integer 8 id"; "relay forward counter";
            }
            leaf int8val{ relay-reply-count {
              type uint8; uint32;
              mandatory true;
              description "operator integer 8 value"; "relay reply counter";
            }
          }
        }
    }

  /*
   * Notifications
   */

  notification notifications {
    description "dhcpv6 server notification module";
    container operator-option-uri dhcpv6-server-event {
      description "operator uri option";
            reference "RFC7227: Guidelines for Creating New DHCPv6
              Options";
            leaf enable "dhcpv6 server event";
      container pool-running-out {
              type boolean;
              mandatory true;
        description "indicate whether this
                option will be included "raised when the address/prefix pool is going to
          run out.  A threshold for utilization ratio of the pool has
          been defined in the
                option set";
            }
            list uri{
              key uri-id;
              description "operator uri info"; server feature so that it will notify the
          administrator when the utilization ratio reaches the
          threshold, and such threshold is a settable parameter";
      leaf uri-id max-address-utilization-ratio {
        type uint8; uint16;
        mandatory true;
        description "operator uri id"; "address pool utilization ratio threshold";
      }
      leaf uri{ address-utilization-ratio {
        type string; uint16;
        mandatory true;
        description "operator uri value";
              }
            } "current address pool utilization ratio";
      }
          container operator-option-textstring
      leaf max-prefix-utilization-ratio {
              type uint16;
              mandatory true;
              description "operator itext string option";
            reference "RFC7227: Guidelines for Creating New DHCPv6 Options"; "prefix pool utilization ratio threshold";
            }
      leaf enable prefix-utilization-ratio {
        type boolean; uint16;
        mandatory true;
        description "indicate whether this
                option will be included in the
                option set"; "current prefix pool utilization ratio";
      }
            list textstring{
              key textstring-id;
      container duid {
        description "operator text string info"; "Sets the DUID";
        uses duid;
      }
      leaf textstring-id serv-name {
        type uint8;
                mandatory true; string;
        description "operator text string id"; "server name";
      }
      leaf textstring{ pool-name {
        type string;
        mandatory true;
        description "operator text string value";
              } "pool name";
      }
    }
    container operator-option-var-data invalid-client-detected {
      description "operator variable length data option";
            reference "RFC7227: Guidelines for Creating New DHCPv6 Options";
            leaf enable {
              type boolean;
              mandatory true; "raised when the server has found a client which
        can be regarded as a potential attacker. Some description "indicate whether this
                option will
        could also be included in included.";
      container duid {
        description "Sets the
                option set"; DUID";
        uses duid;
      }
            list int32val{
              key var-data-id;
              description "operator ivariable length data info";
      leaf var-data-id description {
        type uint8;
                mandatory true; string;
        description "operator variable length id"; "description of the event";
      }
              leaf var-data{
                type binary;
                mandatory true;
                description "operator variable length value";
    }
  }
  }
          container operator-option-dns-wire
}

<CODE ENDS>

3.2.  DHCPv6 Relay YANG Model

   This module imports typedefs from [RFC6991].

<CODE BEGINS> file "ietf-dhcpv6-relay@2017-12-22.yang"
module ietf-dhcpv6-relay {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-relay";
  prefix "dhcpv6-client";

  import ietf-inet-types {
    prefix inet;
    revision-date "2013-07-15";

  }

  import ietf-dhcpv6-options {
    prefix dhcpv6-options;
    revision-date "2017-12-22";
  }

  organization "DHC WG";
  contact "yong@csnet1.cs.tsinghua.edu.cn
    lh.sunlinh@gmail.com
    ian.farrer@telekom.de
    sladjana.zechlin@telekom.de
    hezihao9512@gmail.com";

  description "This model defines a YANG data model that can be
    used to configure and manage a DHCPv6 relay.";

  revision 2017-12-22 {
    description "operator dns wire format domain name list option"; "Resolve most issues on Ian's github.";
    reference "RFC7227: Guidelines for Creating New DHCPv6
              Options";
            leaf enable "I-D: draft-ietf-dhc-dhcpv6-yang";
  }

  revision 2017-11-24 {
              type boolean;
              mandatory true;
    description "indicate whether this
                option will be included in "First version of the
                option set"; separated relay specific
      YANG model.";

    reference "I-D: draft-ietf-dhc-dhcpv6-yang";
  }
            list operator-option-dns-wire{
              key operator-option-dns-wire-id;

  /*
   * Grouping
   */

  grouping vendor-infor {
   description "operator dns wire format info"; "Vendor information.";
   container vendor-info {
     description "";
     leaf operator-option-dns-wire-id ent-num {
       type uint8; uint32;
       mandatory true;
       description "operator dns wire format id"; "enterprise number";
     }
              leaf operator-option-dns-wire{
     leaf-list data {
       type binary;
                mandatory true; string;
       description "operator dns wire format value"; "specific vendor info";
     }
   }
  }
  /*
   * Data Nodes
   */

container s46-dmr-option relay {
    presence "Enables the relay";
    description "s46 dmr option";
            reference "RFC7598: DHCPv6 Options for Configuration "dhcpv6 relay portion";
    container relay-config{
      description "configuration tree of
              Softwire Address and Port-Mapped Clients";
            leaf enable relay";
        container relay-attributes {
              type boolean;
              mandatory true;
            description "indicate whether this
                option will be included in "A container describes
              some basic attributes of the relay
              agent including some relay agent
              specific options data that need to
              be configured previously. Such options
              include Remote-Id option set";
            }
            list dmr {
              key dmr-id;
              description "dmr info"; and
              Subscriber-Id option.";
            leaf dmr-id name {
              type uint8;
                mandatory true; string;
              description "dmr id"; "relay agent name";
            }
            leaf dmr-prefix-len {
                type uint8;
                mandatory true; description "dmr prefix length";
              }
              leaf dmr-ipv6-prefix {
              type inet:ipv6-prefix;
                mandatory true;
                description "dmr ipv6 prefix";
              }
            }
          }
          container s46-v4-v6-binding-option { string;
              description "s46 binding option";
            reference "RFC7598: DHCPv6 Options for Configuration "description of
              Softwire Address and Port-Mapped Clients";
            leaf enable the relay agent";
            }
            leaf-list dest-addrs {
              type boolean;
              mandatory true; inet:ipv6-address;
              description "indicate whether this
                option will "Each DHCPv6 relay agent may
                be included in the
                option set"; configured with a list of destination
                addresses. This node defines such a list
                of IPv6 addresses that may include
                unicast addresses, multicast addresses
                or other addresses.";
            }
            list ce subscribers {
              key ce-id; subscriber;
              description "ce info"; "subscribers";
              leaf ce-id subscriber {
                type uint8;
                mandatory true;
                description "ce id"; "subscriber";
              }
              leaf ipv4-addr subscriber-id {
                type inet:ipv4-address; string;
                mandatory true;
                description "ce ipv4 addr"; "subscriber id";
              }
            }
            list remote-host {
              key ent-num;
              description "remote host";
              leaf bind-prefix6-len ent-num {
                type uint8; uint32;
                mandatory true;
                description "bind ipv6 prefix
                  length"; "enterprise number";
              }
              leaf bind-ipv6-prefix remote-id {
                type inet:ipv6-prefix; string;
                mandatory true;
                description "bind ipv6 prefix";
              }
              uses portset-para; "remote id";
              }
            }
            uses vendor-infor;
          }
        //NB - The list of

          container rsoo-option-sets {
          description "DHCPv6 relay agent could provide
                some information that would be useful to DHCPv6 client.
            Since relay agent cannot provide options needs directly to be updated with newer options.
      }
            the client, RSOO-enabled options are defined to
            propose options for the server to send to the client.
            This container network-ranges models such RSOO-enabled options.";
          reference "RFC6422";
            list option-set {
              key id;
              description "This model supports a hierarchy
          to achieve dynamic configuration. That list under the 'rsoo-option-sets' container
              is similar to
          say we could configure the that defined in server at module. It allows
              the relay to implement several sets of RSOO-enabled options
              for different
          levels through this model. interfaces. The top level is a
          global level which is defined as list only include the container
          'network-ranges'. The following levels are EAP
              Re-authentication Protocol (ERP) Local Domain Name DHCPv6 Option
              defined as sub-containers under it. The
          'network-ranges' contains the parameters
          (e.g. option-sets) that would be allocated to
          all in RFC6440, since it is the clients served only one
              RSOO-enabled options accepted by this server."; IANA so far.";
                leaf option-set-id id {
                  type uint8; uint32;
                  description "a specific option set"; "option sed id";
                }
              uses dhcpv6-options:relay-supplied-option-definitions;
            }
          }

          list network-range relay-if {
            // if - This should reference an entry in ietf-interfaces
            key network-range-id; if-name;
            description "Under the 'network-ranges'
            container, "A relay agent may have several
              interfaces, we should provide a 'network-range' way to configure
              and manage parameters on the interface-level. A
              list that describes specific interfaces and
              their corresponding parameters is
            defined employed to configure
              fulfil the server at configfuration. Here we use a
            network level which is also considered string
              called 'if-name; 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."; of list.";
            leaf network-range-id if-name {
              type uint8; string;
              mandatory true;
              description "equivalent to subnet id"; "interface name";
            }
            leaf network-description enable {
              type string; boolean;
              mandatory true;
              description "description of the subnet";
                "whether this interface is enabled";
            }
            leaf network-prefix ipv6-address {
              type inet:ipv6-prefix;
            mandatory true; inet:ipv6-address;
              description "subnet prefix";
                "ipv6 address for this interface";
            }
            leaf inherit-option-set interface-id {
              type boolean;
            mandatory true; string;
              description "indicate whether to inherit
              the configuration from higher level"; "interface id";
            }
            leaf option-set-id rsoo-option-set-id {
              type uint8;
            mandatory true;
            description "the selected option-set";
          }
          container reserved-addresses leafref {
                path "/relay/relay-config/rsoo-option-sets/option-set/id";
              }
              description "reserved addresses"; "Configured Relay Supplied Option set";
            }
            list static-binding next-entity {
              key cli-id; dest-addr;
              description "static binding "This node defines
                a list that is used to describe
                the next hop entity of
                reserved addresses"; this
                relay distinguished by their
                addresses.";
              leaf cli-id dest-addr {
                type uint32; inet:ipv6-address;
                mandatory true;
                description "client id";
              }
              container duid {
                description "Sets the DUID";
                uses duid;
              }
              leaf-list reserv-addr {
                type inet:ipv6-address;
                description "reserved "destination addr";
              }
            }
            leaf-list other-reserv-addr
              leaf available {
                type inet:ipv6-address; boolean;
                mandatory true;
                description "other reserved
                addr";
            } "whether the next entity
                  is available or not";
              }
          container reserved-prefixes {
            description "reserved prefixes";
            list static-binding {
              key cli-id;
              description "static binding";
              leaf cli-id multicast {
                type uint32; boolean;
                mandatory true;
                description "client id";
              }
              container duid {
                description "Sets "whether the DUID";
                uses duid; address is
                  multicast or not";
              }
              leaf reserv-prefix-len server {
                type uint8; boolean;
                mandatory true;
                description "reserved
                  prefix length"; "whether the next entity
                  is a server";
              }
            }
          }

    }

  container relay-state{
    config "false";
    description "state tree of relay";
    list relay-if{
      key if-name;
      description "...";
      leaf reserv-prefix { if-name{
        type inet:ipv6-prefix; string;
        mandatory true;
        description
                  "reserved prefix";
              } "interface name";
      }
            list pd-route {
                // if - need to look at if/how we model these. If they are
                // going to be modelled, then they should be ro state
                // entries (we're not trying to configure routes here)
                key pd-route-id;
                description "pd route";
                leaf exclude-prefix-len pd-route-id {
                  type uint8;
                  mandatory true;
                  description "exclude prefix
                length"; "pd route id";
                }
                leaf exclude-prefix requesting-router-id {
                  type inet:ipv6-prefix; uint32;
                  mandatory true;
                  description "exclude prefix"; "requesting router id";
                }
            list other-reserv-prefix {
              key reserv-id;
              description
                "other reserved prefix";
                leaf reserv-id delegating-router-id {
                  type uint8; uint32;
                  mandatory true;
                  description
                  "reserved prefix "delegating router id";
                }
                leaf prefix-len next-router {
                  type uint8; inet:ipv6-address;
                  mandatory true;
                  description "prefix length"; "next router";
                }
                leaf prefix last-router {
                  type inet:ipv6-prefix; inet:ipv6-address;
                  mandatory true;
                  description
                  "reserved prefix";
              } "previous router";
                }
              }
          container address-pools {
            description "A container describes
              the DHCPv6 server's address pools.";
      list address-pool { next-entity{
        key pool-id; dest-addr;
        description "A DHCPv6 server can
                be configured with several address
                pools. This list "This node defines such
                address pools which a list that is used to
          describe the next hop entity of this relay agent.
          Different entities are distinguish distinguished by the key called 'pool-name'."; their
          addresses.";
        leaf pool-id { dest-addr{
          type uint8; inet:ipv6-address;
          mandatory true;
          description "pool id"; "destination addr";
        }
              leaf pool-prefix
        container packet-stats {
                type inet:ipv6-prefix;
                mandatory true;
          description "pool prefix";
              } "packet statistics";
          leaf start-address solicit-rvd-count {
                      type inet:ipv6-address-no-zone; uint32;
                      mandatory true;
                      description "start address";
                        "solicit received counter";
                    }
                  leaf end-address request-rvd-count {
                    type inet:ipv6-address-no-zone; uint32;
                    mandatory true;
                    description "end address";
                      "request received counter";
                  }
                  leaf renew-time renew-rvd-count {
                    type yang:timeticks; uint32;
                    mandatory true;
                    description
                      "renew time"; received counter";
                  }
                  leaf rebind-time rebind-rvd-count {
                    type yang:timeticks; uint32;
                    mandatory true;
                    description
                      "rebind time"; recevied counter";
                  }
                  leaf preferred-lifetime decline-rvd-count {
                    type yang:timeticks; uint32;
                    mandatory true;
                    description "preferred lifetime
                  for IA";
                      "decline received counter";
                  }
                  leaf valid-lifetime release-rvd-count {
                    type yang:timeticks; uint32;
                    mandatory true;
                    description "valid liftime for IA";
                      "release received counter";
                  }
                  leaf total-ipv6-count info-req-rvd-count {
                    type uint64;
                config "false"; uint32;
                    mandatory true;
                    description "how many ipv6
                  addressses are in the pool";
                      "information request counter";
                  }
                  leaf used-ipv6-count relay-for-rvd-count {
                    type uint64;
                config "false"; uint32;
                    mandatory true;
                    description "how many are
                  allocated";
                      "relay forward received counter";
                  }
                  leaf utilization-ratio relay-rep-rvd-count {
                    type threshold; uint32;
                    mandatory true;
                    description "the utilization ratio";
                      "relay reply received counter";
                  }
                  leaf inherit-option-set packet-to-cli-count {
                    type boolean; uint32;
                    mandatory true;
                    description "indicate whether
                      "packet to
                  inherit the configuration from
                  higher level"; client counter";
                  }
                  leaf option-set-id adver-sent-count {
                    type uint8; uint32;
                    mandatory true;
                    description "the selected option-set";
              }
                      "advertisement sent counter";
                  }
            list binding-info {
              key cli-id;
              config "false";
              description "A list records a binding
                information for each DHCPv6 client
                that has already been allocated IPv6
                addresses.";
                  leaf cli-id confirm-sent-count {
                    type uint32;
                    mandatory true;
                    description "client id";
              }
              container duid {
                description "Sets the DUID";
                uses duid;
                      "confirm sent counter";
                  }
              list cli-ia {
                key iaid;
                description "client IA";
                  leaf ia-type reply-sent-count {
                    type string; uint32;
                    mandatory true;
                    description "IA type";
                      "reply sent counter";
                  }
                  leaf iaid reconfig-sent-count {
                    type uint32;
                    mandatory true;
                    description "IAID";
                      "reconfigure sent counter";
                  }
                leaf-list cli-addr
                  leaf relay-for-sent-count {
                    type inet:ipv6-address; uint32;
                    mandatory true;
                    description "client addr";
                      "relay forward sent counter";
                  }
                  leaf pool-id relay-rep-sent-count {
                    type uint8; uint32;
                    mandatory true;
                    description "pool id";
                      "relay reply sent counter";
                  }
        }

      }
    }

      container prefix-pools {
            description "If a server supports prefix
              delegation function, this container will
              be used to define the delegating router's
              refix pools.";
            list prefix-pool relay-stats {
              key pool-id;
          config "false";
          description "Similar to server's
                address pools, a delegating router
                can also be configured with multiple
                prefix pools specified by a list
                called 'prefix-pool'."; "relay statistics";
          leaf pool-id cli-packet-rvd-count {
            type uint8; uint32;
            mandatory true;
            description "pool id"; "client packet received counter";
          }
          leaf prefix relay-for-rvd-count {
            type inet:ipv6-prefix; uint32;
            mandatory true;
            description "ipv6 prefix"; "relay forward received counter";
          }
          leaf prefix-length relay-rep-rvd-count {
            type uint8; uint32;
            mandatory true;
            description "prefix length"; "relay reply recevied counter";
          }
          leaf renew-time packet-to-cli-count {
            type yang:timeticks; uint32;
            mandatory true;
            description "renew time"; "packet to client counter";
          }
          leaf rebind-time relay-for-sent-count {
            type yang:timeticks; uint32;
            mandatory true;
            description "rebind time"; "relay forward sent counter";
          }
          leaf preferred-lifetime relay-rep-sent-count {
            type yang:timeticks; uint32;
            mandatory true;
            description "preferred lifetime for
                  IA"; "relay reply sent counter";
          }
          leaf valid-lifetime discarded-packet-count {
            type yang:timeticks; uint32;
            mandatory true;
            description "valid lifetime for IA"; "discarded packet counter";
          }
        }

  }

  }

  /*
   * Notifications
   */

  notification notifications {
    description "dhcpv6 relay notification module";
    container dhcpv6-relay-event {
      description "dhcpv6 relay event";
      container topo-changed {
        description "raised when the topology
          of the relay agent is changed.";
        leaf utilization-ratio relay-if-name {
          type threshold; string;
          mandatory true;
          description "utilization ratio"; "relay interface name";
        }
        leaf inherit-option-set first-hop {
          type boolean;
          mandatory true;
          description "whether to inherit
                  configuration from higher level"; "first hop";
        }
        leaf option-set-id last-entity-addr {
          type uint8; inet:ipv6-address;
          mandatory true;
          description "the selected option-set"; "last entity address";
        }
      }
            list binding-info {
              key cli-id;
              config "false";
              description "A list records a
                binding information for each
    }
  }
}

<CODE ENDS>

3.3.  DHCPv6 client that has already
                been allocated IPv6 addresses.";
              leaf cli-id Client YANG Model

   This module imports typedefs from [RFC6991].

<CODE BEGINS> file "ietf-dhcpv6-client@2017-12-22.yang"
module ietf-dhcpv6-client {
                type uint32;
                mandatory true;
                description "client id";
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-client";
  prefix "dhcpv6-client";

  import ietf-inet-types {
    prefix inet;
    revision-date "2013-07-15";
  }
              container duid
  import ietf-yang-types {
                description "Sets the DUID";
                uses duid;
    prefix yang;
    revision-date "2013-07-15";
  }
              list cli-iapd
  import ietf-dhcpv6-options {
                key iaid;
    prefix dhcpv6-options;
    revision-date "2017-12-22";
  }

  organization "DHC WG";
  contact "yong@csnet1.cs.tsinghua.edu.cn
    wangh13@mails.tsinghua.edu.cn
    lh.sunlinh@gmail.com
    ian.farrer@telekom.de
    sladjana.zechlin@telekom.de
    hezihao9512@gmail.com  ";

  description "client IAPD";
                leaf iaid "This model defines a YANG data model that can be
    used to configure and manage a DHCPv6 client.";

  revision 2017-12-22 {
                  type uint32;
                  mandatory true;
    description "IAID"; "Resolve most issues on Ian's github.";
    reference "I-D: draft-ietf-dhc-dhcpv6-yang";
  }
                leaf-list cli-prefix

  revision 2017-11-24 {
                  type inet:ipv6-prefix;
      description
                    "client ipv6 prefix"; "First version of the separated client specific
        YANG model.";
      reference "I-D: draft-ietf-dhc-dhcpv6-yang";
  }
                leaf-list cli-prefix-len

  /*
   * Grouping
   */

  grouping vendor-infor {
                  type uint8;
   description
                    "client prefix length";
                } "Vendor information.";
   container vendor-info {
     description "";
     leaf pool-id ent-num {
       type uint8; uint32;
       mandatory true;
       description "pool id"; "enterprise number";
     }
     leaf-list data {
       type string;
       description "specific vendor info";
     }
   }
  }
          container hosts {
            description "hosts level";
            list host

  grouping duid {
              key cli-id;
      description "specific host"; "DHCP Unique Identifier";
      reference "RFC3315: Section 9";
      leaf cli-id type-code {
          type uint32;
                mandatory true; uint16;
          default 65535;
          description "client id"; "Type code of this DUID";
        }
              container duid
      choice duid-type {
      default duid-invalid;
        description "Sets "Selects the DUID";
                uses duid; format for the DUID.";
        case duid-llt {
          description "DUID Based on Link-layer Address Plus Time (Type 1 - DUID-LLT)";
          reference "RFC3315 Section 9.2";
          leaf duid-llt-hardware-type {
            type uint16;
            description "Hardware type as assigned by IANA (RFC826).";
          }
          leaf inherit-option-set duid-llt-time {
            type boolean;
                mandatory true; yang:timeticks;
            description "whether to inherit
                  configuration
                  from higher level"; "The time value is the time that the DUID is generated
              represented in seconds since midnight (UTC), January 1, 2000,
                          modulo 2^32.";
          }
          leaf option-set-id duid-llt-link-layer-addr {
            type uint8;
                mandatory true; yang:mac-address;
            description "the selected option-set"; "Link-layer address as described in RFC2464";
          }
        }
        case duid-en {
          description "DUID Assigned by Vendor Based on Enterprise Number (Type 2 - DUID-EN)";
          reference "RFC3315 Section 9.3";
          leaf nis-domain-name duid-en-enterprise-number {
            type string; uint32;
            description "nis domain name"; "Vendor's registered Private Enterprise Number as
              maintained by IANA";
          }
          leaf nis-plus-domain-name duid-en-identifier {
            type string;
            description "nisp domain name";
              }
            }
          } "Indentifier, unique to the device that is using it";
          }
        }
      container relay-opaque-paras
        case duid-ll {
          description "This container contains some
          opaque values in Relay Agent options that
          need to be configured "DUID Based on the server side
          only for value match. Such Relay Agent
          options include Interface-Id option,
                  Remote-Id option and Subscriber-Id option.";
        list relays Link-layer Address (Type 3 - DUID-LL)";
          reference "RFC3315 Section 9.4";
          leaf duid-ll-hardware-type {
          key relay-name;
            type uint16;
            description "relay agents"; "Hardware type as assigned by IANA (RFC826).";
          }
          leaf relay-name duid-ll-link-layer-addr {
              type string;
            mandatory true; yang:mac-address;
              description "relay agent name"; "Link-layer address as described in RFC2464";
        }
          list interface-info
        }
        case duid-uuid {
            key if-name;
          description "interface info"; "DUID Based on Universally Unique Identifier (Type 4 - DUID-UUID)";
          reference "RFC6335 Defination of the UUID-Based Unique Identifier";
          leaf if-name uuid {
            type string;
              mandatory true; yang:uuid;
            description "interface name"; "A Universally Unique IDentifier in the string representation
                defined in RFC 4122.  The canonical representation uses
                lowercase characters";

          }
        }
        case duid-invalid {
          description "DUID based on free raw bytes";
          leaf interface-id data {
            type string;
              mandatory true; binary;
            description "interface id"; "The bits to be used as the identifier";
          }
        }
          list subscribers
      }
    }
  grouping portset-para {
            key subscriber;
    description "subscribers";
            leaf subscriber "portset parameters";
    container port-parameter {
              type uint8;
              mandatory true;
      description "subscriber";
            } "port parameter";
      leaf subscriber-id offset {
        type string; uint8;
        mandatory true;
        description "subscriber id";
            } "offset in a port set";
      }
          list remote-host {
            key ent-num;
            description "remote host";
      leaf ent-num psid-len {
        type uint32; uint8;
        mandatory true;
        description "enterprise number"; "length of a psid";
      }
      leaf remote-id psid {
        type string; uint16;
        mandatory true;
        description "remote id";
            } "psid value";
      }
    }
  }
      container rsoo-enabled-options

  grouping iaid {
    description "rsoo enabled options"; "IA is a construct through which a server and a
        client can identify, group, and manage a set of related IPv6
        addresses. The key of the list rsoo-enabled-option{ is a 4-byte number IAID defined
        in [RFC3315].";
      list identity-association {
        config "false";
        key option-code; iaid;
        description "rsoo enabled option"; "IA";
        leaf option-code iaid {
          type uint16; uint32;
          mandatory true;
          description "option code"; "IAID";
        }
        leaf description ia-type {
          type string;
          mandatory true;
          description "description of the option"; "IA type";
        }
        leaf-list ipv6-addr {
          type inet:ipv6-address;
          description "ipv6 address";
        }
        leaf-list ipv6-prefix {
          type inet:ipv6-prefix;
          description "ipv6 prefix";
        }
      container packet-stats
        leaf-list prefix-length {
        config "false";
          type uint8;
          description "A container presents
          the packet statistics related to
          the DHCPv6 server."; "ipv6 prefix length";
        }
        leaf solicit-count t1-time {
          type uint32; yang:timeticks;
          mandatory true;
          description "solicit counter"; "t1 time";
        }
        leaf request-count t2-time {
          type uint32; yang:timeticks;
          mandatory true;
          description "request counter"; "t2 time";
        }
        leaf renew-count preferred-lifetime {
          type uint32; yang:timeticks;
          mandatory true;
          description "renew counter"; "preferred lifetime";
        }
        leaf rebind-count valid-lifetime {
          type uint32; yang:timeticks;
          mandatory true;
          description "rebind counter"; "valid lifetime";
        }
      }

  }

  /*
   * Data Nodes
   */

 container client {
    presence "Enables the client";
    description "dhcpv6 client portion";
    container client-config{
      description "configuration tree of client";
        container duid {
            description "Sets the DUID";
            uses duid;
          }
          list client-if {
            key if-name;
            description "A client may have several
              interfaces, it is more reasonable to
              configure and manage parameters on
              the interface-level. The list defines
              specific client interfaces and their
              data. Different interfaces are distinguished
              by the key which is a configurable string
              value.";
            leaf decline-count if-name {
              type uint32; string;
              mandatory true;
              description "decline count"; "interface name";
            }
            leaf release-count cli-id {
              type uint32;
              mandatory true;
              description "release counter"; "client id";
            }
            leaf info-req-count description {
              type uint32;
          mandatory true; string;
              description "information request
            counter";
                "description of the client interface";
            }
            leaf advertise-count pd-function {
              type uint32; boolean;
              mandatory true;
              description "advertise counter"; "Whether the client
                can act as a requesting router
                to request prefixes using prefix
                delegation ([RFC3633]).";
            }
            leaf confirm-count rapid-commit {
              type uint32; boolean;
              mandatory true;
              description "confirm counter"; "'1' indicates a client can initiate a Solicit-Reply
                message exchange by adding a Rapid Commit option in Solicit
                message. '0' means the client is not allowed to add a Rapid
                Commit option to request addresses in a two-message exchange
                pattern.";
            }
            container mo-tab {
              description "The management tab label indicates the operation
                mode of the DHCPv6 client. 'm'=1 and 'o'=1 indicate the
                client will use DHCPv6 to obtain all the configuration data.
                'm'=1 and 'o'=0 are a meaningless combination. 'm'=0 and 'o'=1
                indicate the client will use stateless DHCPv6 to obtain
                configuration data apart from addresses/prefixes data.
                'm'=0 and 'o'=0 represent the client will not use DHCPv6
                but use SLAAC to achieve configuration.";
                // if - not sure about the intended use here as it seems
                // to be redfining what will be received in the PIO. Is
                // the intention to be whether they PIO options will be
                // obeyed as received or overridden?
              leaf reply-count m-tab {
                type uint32; boolean;
                mandatory true;
                description "reply counter"; "m tab";
              }
              leaf reconfigure-count o-tab {
                type uint32; boolean;
                mandatory true;
                description "reconfigure counter"; "o tab";
              }
        leaf relay-forward-count {
          type uint32;
          mandatory true;
          description "relay forward counter";
            }
        leaf relay-reply-count
            container client-configured-options {
          type uint32;
          mandatory true;
              description "relay reply counter"; "client configured options";
              uses dhcpv6-options:client-option-definitions;
            }
    }

    }

    container relay {
      presence "Enables relay"; client-state{
      config "false";
      description "dhcpv6 relay portion"; "state tree of client";
        container relay-attributes if-other-paras {
            description "A client can obtain
              extra configuration data other than
              address and prefix information through
              DHCPv6. This container describes
          some basic attributes of such
              data the relay
          agent including some relay agent
          specific options client was configured. The
              potential configuration data that need to
          be configured previously. Such options may
              include Remote-Id option and
          Subscriber-Id option.";
        leaf name DNS server addresses, SIP
              server domain names, etc.";
            uses dhcpv6-options:server-option-definitions;
          }
    }
  }
  /*
   * Notifications
   */

  notification notifications {
          type string;
  description "relay agent name";
        }
        leaf "dhcpv6 client notification module";
    container dhcpv6-client-event {
      description "dhcpv6 client event";
      container ia-lease-event {
          type string;
        description "description of "raised when the relay agent";
        }
        leaf-list dest-addrs
          client was allocated a new IA from
          the server or it renew/rebind/release
          its current IA";
        leaf event-type {
          type inet:ipv6-address; enumeration{
            enum "allocation" {
              description "Each DHCPv6 relay agent may
            be configured with a list of destination
            addresses. This node defines such a list
            of IPv6 addresses that may include
            unicast addresses, multicast addresses
            or other addresses."; "allocate";
            }
        list subscribers
            enum "rebind" {
          key subscriber;
              description "subscribers";
          leaf subscriber "rebind";
            }
            enum "renew" {
            type uint8;
            mandatory true;
              description "subscriber"; "renew";
            }
          leaf subscriber-id
            enum "release" {
            type string;
              description "release";
            }
          }
          mandatory true;
          description "subscriber id";
          } "event type";
        }
        list remote-host
        container duid {
          key ent-num;
          description "remote host"; "Sets the DUID";
          uses duid;
        }
        leaf ent-num iaid {
          type uint32;
          mandatory true;
          description "enterprise number"; "IAID";
        }
        leaf remote-id serv-name {
          type string;
            mandatory true;
          description "remote id"; "server name";
        }
        leaf description {
          type string;
          description "description of event";
        }
        uses vendor-infor;

      }
      container relay-supplied-options-option invalid-ia-detected {
        description "relay supplied options option";
        list rsoo-set "raised when the identity
          association of the client can be proved
          to be invalid.  Possible condition includes
          duplicated address, illegal address, etc.";
        container duid {
          key rsoo-set-id;
          description "rsoo set"; "Sets the DUID";
          uses duid;
        }
        leaf rsoo-set-id cli-duid {
          type uint8; uint32;
          mandatory true;
          description "rsoo set id"; "duid of client";
        }
          container erp-local-domain-name-option {
            description "erp local domain name option";
        leaf enable iaid {
          type boolean; uint32;
          mandatory true;
          description "indicate whether
                this option is included in the
                rsoo set"; "IAID";
        }
            list erp-for-client
        leaf serv-name {
              key cli-id;
          type string;
          description "erp for client"; "server name";
        }
        leaf cli-id description {
          type uint32;
                mandatory true; string;
          description "client id"; "description of the event";
        }
      }
      container retransmission-failed {
        description "raised when the retransmission
          mechanism defined in [RFC3315] is failed.";
        container duid {
          description "Sets the DUID";
          uses duid;
        }
        leaf erp-name description {
          type string;
                mandatory true; enumeration {
            enum "MRC failed" {
              description "erp name";
              }
            }
          }
        } "MRC failed";
            }
      list relay-if
            enum "MRD failed" {
        key if-name;
              description "A relay agent may have several
          interfaces, we should provide a way to configure
          and manage parameters on the interface-level. A
          list that describes specific interfaces and
          their corresponding parameters is employed to
          fulfil the configfuration. Here we use a string
          called 'if-name; as the key of list.";
        leaf if-name {
          type string; "MRD failed";
            }
          }
          mandatory true;
          description "interface name"; "description of failure";
        }
        leaf enable

      }
      container failed-status-turn-up {
          type boolean;
          mandatory true;
        description
            "whether this interface is enabled";
        }
        leaf ipv6-address "raised when the client receives
          a message includes an unsuccessful Status Code
          option.";
        container duid {
          type inet:ipv6-address;
          description
            "ipv6 address for this interface"; "Sets the DUID";
          uses duid;
        }
        leaf interface-id status-code {
          type string;
          description "interface id";
        }
        leaf-list rsoo-set enumeration {
          type uint8;
          description "configured rsoo set";

        }
        list pd-route
            enum "1" {
          key pd-route-id;
              description "pd route";
          leaf pd-route-id "UnspecFail";
            }
            enum "2" {
            type uint8;
            mandatory true;
              description "pd route id"; "NoAddrAvail";
            }
          leaf requesting-router-id
            enum "3" {
            type uint32;
            mandatory true;
              description "requesting router id"; "NoBinding";
            }
          leaf delegating-router-id
            enum "4" {
            type uint32;
            mandatory true;
              description "delegating router id"; "NotOnLink";
            }
          leaf next-router
            enum "5" {
            type inet:ipv6-address;
            mandatory true;
              description "next router"; "UseMulticast";
            }
          }
          leaf last-router {
            type inet:ipv6-address;
          mandatory true;
          description "previous router"; "employed status code";
        }
      }
        list next-entity
    }
  }
}

<CODE ENDS>

3.4.  DHCPv6 Options YANG Model

   This module imports typedefs from [RFC6991].

<CODE BEGINS> file "ietf-dhcpv6-options@2017-12-22.yang"
module ietf-dhcpv6-options {
          key dest-addr;
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-options";
  prefix "dhcpv6-options";

  import ietf-inet-types {
    prefix inet;
    revision-date "2013-07-15";
  }
  import ietf-yang-types {
    prefix yang;
    revision-date "2013-07-15";
  }

  organization "DHC WG";
  contact "yong@csnet1.cs.tsinghua.edu.cn
    wangh13@mails.tsinghua.edu.cn
    lh.sunlinh@gmail.com
    ian.farrer@telekom.de
    sladjana.zechlin@telekom.de
    hezihao9512@gmail.com";

  description "This node model defines a list YANG data model that is can be
    used to describe
            the next hop entity configure and manage a DHCPv6 server.";

  revision 2017-12-22 {
    description "Resolve most issues on Ian's github.";
    reference "I-D: draft-ietf-dhc-dhcpv6-yang";
  }

  revision 2017-11-24 {
    description "First version of this
            relay distinguished by their
            addresses.";
          leaf dest-addr the separated DHCPv6 options
      YANG model.";

    reference "I-D:draft-ietf-dhc-dhcpv6-yang";
  }

  /*
   * Features
   */

  //  features for server options
  feature server-unicast-op {
    description "Support for Server Unicast option";
  }
  feature sip-server-domain-name-list-op {
    description "Support for SIP Server Domain Name List option";
  }
  feature sip-server-address-list-op {
    description "Support for SIP Server Address List option";
  }
  feature dns-config-op {
            type inet:ipv6-address;
            mandatory true;
    description "destination addr"; "Support for DNS Recursive Name Server option";

  }
          leaf available
  feature domain-searchlist-op {
            type boolean;
            mandatory true;
    description "whether the next entity
              is available or not"; "Support for Domain Search List Option";
  }
          leaf multicast
  feature nis-config-op {
            type boolean;
            mandatory true;
    description "whether the address is
              multicast or not"; "Support for Network Information Service (NIS)
      Servers option";
  }
          leaf server
  feature nis-plus-config-op {
            type boolean;
            mandatory true;
    description "whether the next entity
              is a server"; "Support for Network Information Service V2 (NIS+)
      Servers option";
  }
          container packet-stats
  feature nis-domain-name-op {
            config "false";
    description "packet statistics";
            leaf cli-packet-rvd-count "Support for Network Information Service (NIS)
      Domain Name option";
  }
  feature nis-plus-domain-name-op {
              type uint32;
              mandatory true;
    description "client received packet
                counter"; "Support for Network Information Service V2 (NIS+)
      Server option";
  }
            leaf solicit-rvd-count
  feature sntp-server-op {
              type uint32;
              mandatory true;
    description
                "solicit received counter"; "Support for Simple Network Protocol Configuration
      (SNTP) Servers option";
  }
            leaf request-rvd-count
  feature info-refresh-time-op {
              type uint32;
              mandatory true;
    description
                "request received counter"; "Support for Information Refresh Time option";
  }
            leaf renew-rvd-count
  feature client-fqdn-op {
              type uint32;
              mandatory true;
    description
                "renew received counter"; "Support for Client FQDN option";
  }
            leaf rebind-rvd-count
  feature posix-timezone-op {
              type uint32;
              mandatory true;
    description
                "rebind recevied counter"; "Support for New POIX Timezone option";
  }
            leaf decline-rvd-count
  feature tzdb-timezone-op {
              type uint32;
              mandatory true;
    description
                "decline received counter"; "Support for New TZDB Timezone option";
  }
            leaf release-rvd-count
  feature ntp-server-op {
              type uint32;
              mandatory true;
    description
                "release received counter"; "Support for Network Time Protocol (NTP)
      Server option";
  }
            leaf info-req-rvd-count
  feature boot-file-url-op {
              type uint32;
              mandatory true;
    description
                "information request counter"; "Support for Boot File URL option";
  }
            leaf relay-for-rvd-count
  feature boot-file-param-op {
              type uint32;
              mandatory true;
    description
                "relay forward received counter"; "Support for Boot File Parameters option";
  }
            leaf relay-rep-rvd-count
  feature aftr-name-op {
              type uint32;
              mandatory true;
    description
                "relay reply received counter"; "Support for Address Family Transition
      Router (AFTR) option";
  }
            leaf packet-to-cli-count
  feature kbr-default-name-op {
    description "Support for Kerberos Default Name
      Option";
  }
  feature kbr-kdc-op {
              type uint32;
              mandatory true;
    description
                "packet to client counter"; "Support for Kerberos KDC option";
  }
            leaf adver-sent-count
  feature sol-max-rt-op {
              type uint32;
              mandatory true;
    description
                "advertisement sent counter"; "Support for SOL_MAX_RT option";
  }
            leaf confirm-sent-count
  feature inf-max-rt-op {
              type uint32;
              mandatory true;
    description
                "confirm sent counter"; "Support for INF_MAX_RT option";
  }
            leaf reply-sent-count
  feature addr-selection-op {
              type uint32;
              mandatory true;
    description
                "reply sent counter"; "Support for Address Selection opiton";
  }
            leaf reconfig-sent-count
  feature pcp-server-op {
              type uint32;
              mandatory true;
    description
                "reconfigure sent counter"; "Support for Port Control Protocol (PCP)
      option";
  }
            leaf relay-for-sent-count
  feature s46-rule-op {
              type uint32;
              mandatory true;
    description
                "relay forward sent counter"; "Support for S46 Rule option";
  }
            leaf relay-rep-sent-count
  feature s46-br-op {
              type uint32;
              mandatory true;
    description
                "relay reply sent counter"; "Support for S46 Border Relay (BR) option";
  }
  feature s46-dmr-op {
    description "Support for S46 Default Mapping Rule
      (DMR) option";
  }
  feature s46-v4-v6-binding-op {
    description "Support for S46 IPv4/IPv6 Address
      Bind option";
  }

  // features for relay-supplied options
  feature erp-local-domain-name-op {
    description "Support for ERP Local Domain
      Name option";
  }
      container relay-stats

  // features for client options
  feature option-request-op {
        config "false";
    description "relay statistics";
        leaf cli-packet-rvd-count "Support for Option Request option";
  }
  feature rapid-commit-op {
          type uint32;
          mandatory true;
    description "client packet received counter"; "Support for Rapid Commit option";
  }
        leaf relay-for-rvd-count
  feature user-class-op {
          type uint32;
          mandatory true;
    description "relay forward received counter"; "Support for User Class option";
  }
        leaf relay-rep-rvd-count
  feature vendor-class-op {
          type uint32;
          mandatory true;
    description "relay reply recevied counter"; "Support for Vendor Class option";
  }
        leaf packet-to-cli-count
  feature client-arch-type-op {
          type uint32;
          mandatory true;
    description "packet to client counter"; "Support for Client System Architecture
      Type option";
  }
        leaf relay-for-sent-count
  feature client-network-interface-identifier-op {
          type uint32;
          mandatory true;
    description "relay forward sent counter"; "Support for Client Network Interface
      Identifier option";
  }
        leaf relay-rep-sent-count
  feature kbr-principal-name-op {
          type uint32;
          mandatory true;
    description "relay reply sent counter"; "Support for Kerberos Principal
      Name option";
  }
        leaf discarded-packet-count
  feature kbr-realm-name-op {
          type uint32;
          mandatory true;
    description "discarded packet counter"; "Support Kerberos Realm Name option";
  }
  feature client-link-layer-addr-op {
    description "Support for Client Link-Layer Address
      Option";
  }

  // features for custom options
  feature operator-op-ipv6-address {
    description "Support for Option with IPv6 Addresses";
  }
    container client
  feature operator-op-single-flag {
      presence "Enables client";
    description "dhcpv6 client portion";
      container duid "Support for Option with Single Flag";
  }
  feature operator-op-ipv6-prefix {
    description "Sets the DUID";
        uses duid; "Support for Option with IPv6 Prefix";
  }
      list client-if
  feature operator-op-int32 {
        key if-name;
    description "A client may have several
          interfaces, it is more reasonable to
          configure and manage parameters on
          the interface-level. The list defines
          specific client interfaces and their
          data. Different interfaces are distinguished
          by the key which is a configurable string
          value.";
        leaf if-name "Support for Opion with 32-bit
      Integer Value";
  }
  feature operator-op-int16 {
          type string;
          mandatory true;
    description "interface name"; "Support for Opion with 16-bit
      Integer Value";
  }
        leaf cli-id
  feature operator-op-int8 {
          type uint32;
          mandatory true;
    description "client id"; "Support for Opion with 8-bit
      Integer Value";
  }
        leaf
  feature operator-op-uri {
    description "Support for Opion with URI";
  }
  feature operator-op-textstring {
          type string;
    description
            "description of the client interface"; "Support for Opion with Text
      String";
  }
        leaf pd-function
  feature operator-op-var-data {
          type boolean;
          mandatory true;
    description "Whether the client
            can act as a requesting router
            to request prefixes using prefix
            delegation ([RFC3633])."; "Support for Opion with
      Variable-Length Data";
  }
        leaf rapid-commit
  feature operator-op-dns-wire {
          type boolean;
          mandatory true;
    description "'1' indicates a client can
            initiate a Solicit-Reply message exchange
            by adding a Rapid Commit option in Solicit
            message. '0' means the client is not allowed
            to add a Rapid Commit option to request
            addresses in a two-message exchange
            pattern."; "Support for Opion with DNS Wire
      Format Domain Name List";
  }

  /*
   * Groupings
   */

  grouping portset-para {
   description "portset parameters";
   container mo-tab port-parameter {
     description "The management tab
            label indicates the operation
            mode of the DHCPv6 client. 'm'=1
            and 'o'=1 indicate the client
            will use DHCPv6 to obtain all
            the configuration data. 'm'=1
            and 'o'=0 are a meaningless
            combination. 'm'=0 and 'o'=1
            indicate the client will use
            stateless DHCPv6 to obtain
            configuration data apart from
            addresses/prefixes data.
            'm'=0 and 'o'=0 represent the
            client will not use DHCPv6
            but use SLAAC to achieve
            configuration."; "port parameter";
     leaf m-tab offset {
       type boolean; uint8;
       mandatory true;
       description "m tab"; "offset in a port set";
     }
     leaf o-tab psid-len {
       type boolean; uint8;
       mandatory true;
       description "o tab";
          } "length of a psid";
     }
        container oro-options {
          description "oro options";
          list oro-option {
            key option-code;
            description "oro option";
     leaf option-code psid {
       type uint16;
       mandatory true;
       description "option code"; "psid value";
     }
            leaf
   }
  }

  grouping duid {
      description "DHCP Unique Identifier";
      reference "RFC3315: Section 9";
      leaf type-code {
          type string;
              mandatory true; uint16;
          default 65535;
          description "description "Type code of oro
                options"; this DUID";
        }
      choice duid-type {
      default duid-invalid;
        description "Selects the format for the DUID.";
        case duid-llt {
          description "DUID Based on Link-layer Address Plus Time (Type 1 - DUID-LLT)";
          reference "RFC3315 Section 9.2";

          leaf duid-llt-hardware-type {
            type uint16;
            description "Hardware type as assigned by IANA (RFC826).";
          }
          leaf duid-llt-time {
            type yang:timeticks;
            description "The time value is the time that the DUID is generated
              represented in seconds since midnight (UTC), January 1, 2000,
                          modulo 2^32.";
          }
        container client-configured-options
          leaf duid-llt-link-layer-addr {
            type yang:mac-address;
            description "client configured options";
          list new-or-standard-cli-option "Link-layer address as described in RFC2464";
          }
        }
        case duid-en {
            key option-code;
          description "new or standard client option"; "DUID Assigned by Vendor Based on Enterprise Number (Type 2 - DUID-EN)";
          reference "RFC3315 Section 9.3";
          leaf option-code duid-en-enterprise-number {
            type uint16;
              mandatory true; uint32;
            description "option code"; "Vendor's registered Private Enterprise Number as
              maintained by IANA";
          }
          leaf option-name duid-en-identifier {
            type string;
              mandatory true;
            description "option name"; "Indentifier, unique to the device that is using it";
          }
        }
        case duid-ll {
          description "DUID Based on Link-layer Address (Type 3 - DUID-LL)";
          reference "RFC3315 Section 9.4";
          leaf option-description duid-ll-hardware-type {
            type string;
              mandatory true; uint16;
            description "description of client
                option"; "Hardware type as assigned by IANA (RFC826).";
          }
          leaf option-reference duid-ll-link-layer-addr {
              type string; yang:mac-address;
              description "Link-layer address as described in RFC2464";
        }
        }
        case duid-uuid {
          description "the "DUID Based on Universally Unique Identifier (Type 4 - DUID-UUID)";
          reference "RFC6335 Defination of option";
            } the UUID-Based Unique Identifier";
          leaf option-value uuid {
            type string;
              mandatory true; yang:uuid;
            description "the option value"; "A Universally Unique IDentifier in the string representation
                defined in RFC 4122.  The canonical representation uses
                lowercase characters";
          }
        }
          container user-class-option
        case duid-invalid {
          description "user class option"; "DUID based on free raw bytes";
          leaf enable data {
            type boolean;
              mandatory true; binary;
            description "indicate whether this
                option will "The bits to be configured at used as the
                client"; identifier";
          }
            list user-class
        }
      }
    }

  grouping server-option-definitions {
              key user-class-id;
    description "user class"; "Contains definitions for options configured on the
      DHCPv6 server which will be supplied to clients.";
    container server-unicast-option {
      if-feature server-unicast-op;
      presence "Enable this option";
      description "OPTION_UNICAST (12) Server Unicast Option";
      reference "RFC3315: Dynamic Host Configuration Protocol
      for IPv6 (DHCPv6)";
      leaf user-class-id server-address {
        type uint8;
                mandatory true; inet:ipv6-address;
        description "user class id"; "server ipv6 address";
      }
    }
    container sip-server-domain-name-list-option {
        if-feature sip-server-domain-name-list-op;
        presence "Enable this option";
        description "OPTION_SIP_SERVER_D (21) SIP Servers Domain Name List";
        reference "RFC3319: Dynamic Host Configuration Protocol
          (DHCPv6) Options for Session Initiation Protocol (SIP)
          Servers";
          leaf user-class-info sip-serv-domain-name {
            type string;
            mandatory true;
            description "user class info";
              } "sip server domain
              name";
          }
    }
    container vendor-class-option sip-server-address-list-option {
            description "vendor class
        if-feature sip-server-address-list-op;
        presence "Enable this option";
        description "OPTION_SIP_SERVER_A (22) SIP Servers IPv6 Address List";
        reference "RFC3319: Dynamic Host Configuration Protocol
          (DHCPv6) Options for Session Initiation Protocol (SIP)
          Servers";
        list sip-server {
          key sip-serv-id;
          description "sip server info";
          leaf enable sip-serv-id {
            type boolean; uint8;
            mandatory true;
            description "indicate whether this
                option will be configured at the
                client"; "sip server id";
          }
          leaf ent-num sip-serv-addr {
            type uint32; inet:ipv6-address;
            mandatory true;
            description "enterprise number"; "sip server addr";
          }
            leaf-list data {
              type string;
              description "option data";
        }
    }
    container client-fqdn-option dns-config-option {
            description "client fqdn
      if-feature dns-config-op;
      presence "Enable this option";
            leaf enable {
              type boolean;
              mandatory true;
      description "indicate whether this
                option will be configured at the
                client";
            }
            leaf fqdn "OPTION_DNS_SERVERS (23) DNS recursive Name
        Server option";
      reference "RFC3646: DNS Configuration options for Dynamic
        Host Configuration Protocol for IPv6 (DHCPv6)";
      list dns-server {
              type string;
              mandatory true;
        key dns-serv-id;
        description "fqdn";
            } "dns server info";
        leaf server-initiate-update dns-serv-id {
          type boolean; uint8;
          mandatory true;
          description "whether "DNS server initiate"; list entry ID.";
        }
        leaf client-initiate-update dns-serv-addr {
          type boolean; inet:ipv6-address;
          mandatory true;
          description "whether client initiate"; "DNS server address.";
        }
      }
    }
    container client-architecture-type-option domain-searchlist-option {
      if-feature domain-searchlist-op;
      presence "Enable this option";
      description
              "client architecture "OPTION_DOMAIN_LIST (24) Domain Search List Option";
      reference "RFC3646: DNS Configuration options for Dynamic
        Host Configuration Protocol for IPv6 (DHCPv6)";
      list domain-searchlist {
        key domain-searchlist-id;
        description "dns server info";
        leaf domain-searchlist-id {
          type option"; uint8;
          mandatory true;
          description "Domain seachlist entry ID.";
        }
        leaf enable domain-search-list-entry {
          type boolean; string;
          mandatory true;
          description "indicate whether this
                option will be configured at the
                client"; "Domain search list entry.";
        }
      }
    }
    container nis-config-option {
      if-feature nis-config-op;
      presence "Enable this option";
      description "OPTION_NIS_SERVERS (27) Network Information Service (NIS)
        Servers Option.";
      reference "RFC3898: Network Information Service (NIS) Configuration
        Options for Dynamic Host Configuration Protocol for IPv6 (DHCPv6)";
      list architecture-types nis-server {
        key type-id; nis-serv-id;
        description "architecture types"; "nis server info";
        leaf type-id nis-serv-id {
          type uint16; uint8;
          mandatory true;
          description "type "nis server id";
        }
        leaf most-preferred nis-serv-addr {
          type boolean; inet:ipv6-address;
          mandatory true;
          description "most preferred flag"; "nis server addr";
        }
      }
    }
    container client-network-interface-option nis-plus-config-option {
            description
              "client network interface
      if-feature nis-plus-config-op;
      presence "Enable this option";

            leaf enable
      description "OPTION_NISP_SERVERS (28): Network Information Service V2
        (NIS+) Servers Option.";
      reference "RFC3989: Network Information Service (NIS) Configuration
        Options for Dynamic Host Configuration Protocol for IPv6 (DHCPv6)";
      list nis-plus-server {
              type boolean;
              mandatory true;
        key nis-plus-serv-id;
        description "indicate whether this
                option will be configured at the
                client";
            } "NIS+ server information.";
        leaf type nis-plus-serv-id {
          type uint8;
          mandatory true;
          description "type"; "nisp server id";
        }
        leaf major nis-plus-serv-addr {
          type uint8; inet:ipv6-address;
          mandatory true;
          description "major"; "nisp server addr";
        }
      }
    }
    container nis-domain-name-option {
      if-feature nis-domain-name-op;
      presence "Enable this option";
      description "OPTION_NIS_DOMAIN_NAME (29) Network Information
        Service (NIS) Domain Name Option";
      reference "RFC3989: Network Information Service (NIS)
        Configuration Options for Dynamic Host Configuration Protocol
        for IPv6 (DHCPv6)";
      leaf minor nis-domain-name {
        type uint8;
              mandatory true; string;
        description "minor"; "The Network Information Service (NIS) Domain Name
        option is used by the server to convey client's NIS Domain Name
        info to the client.";
      }
    }
    container kerberos-principal-name-option nis-plus-domain-name-option {
            description
              "kerberos principal name
        if-feature nis-plus-domain-name-op;
        presence "Enable this option";
            leaf enable {
              type boolean;
              mandatory true;
        description "indicate whether this
                option will be configured at the
                client";
            } "OPTION_NISP_DOMAIN_NAME (30) Network Information
          Service V2 (NIS+) Domain Name Option";
        reference "RFC3989: Network Information Service (NIS)
          Configuration Options for Dynamic Host Configuration Protocol
          for IPv6 (DHCPv6)";
        leaf principal-name nis-plus-domain-name {
          type string;
              mandatory true;
          description "principal name"; "The Network Information Service V2 (NIS+) Domain Name
          option is used by the server to convey client's NIS+ Domain Name
          info to the client.";
        }
      }
    container client-link-layer-addr-option sntp-server-option {
            description
              "client link layer address
      if-feature sntp-server-op;
      presence "Enable this option";
      description "OPTION_SNTP_SERVERS (31) Simple Network Time Protocol
        (SNTP) Servers Option";
      reference "RFC4075: Simple Network Time Protocol (SNTP) Configuration
        Option for DHCPv6";
      list sntp-server {
        key sntp-serv-id;
        description "sntp server info";
        leaf enable sntp-serv-id {
          type boolean; uint8;
          mandatory true;
          description "indicate whether this
                option will be configured at the
                client"; "sntp server id";
        }
        leaf link-layer-type sntp-serv-addr {
          type uint16; inet:ipv6-address;
          mandatory true;
          description "link layer type"; "sntp server addr";
        }
      }
    }
    container info-refresh-time-option {
      if-feature info-refresh-time-op;
      presence "Enable this option";
      description "OPTION_INFORMATION_REFRESH_TIME (32) Information Refresh
        Time option.";
      reference "RFC4242: Information Refresh Time Option for Dynamic Host
        Configuration Protocol for IPv6 (DHCPv6";
      leaf link-layer-addr info-refresh-time {
        type string; yang:timeticks;
        mandatory true;
        description "link layer address";
            } "The refresh time.";
      }
    }
    container identity-associations {
          config "false";
          description "IA is a construct through
            which a server and a client can identify,
                  group, and manage a set of related IPv6
                    addresses. The key of the list is a
                    4-byte number IAID defined in [RFC3315].";
          list identity-association client-fqdn-option {
            key iaid;
      if-feature client-fqdn-op;
      presence "Enable this option";
      description "IA"; "OPTION_CLIENT_FQDN (39) DHCPv6 Client FQDN Option";
      reference "RFC4704: The Dynamic Host Configuration Protocol for IPv6
        (DHCPv6) Client Fully Qualified Domain Name (FQDN) Option";
      leaf iaid server-initiate-update {
        type uint32; boolean;
        mandatory true;
        description "IAID"; "server initiate";
      }
      leaf ia-type client-initiate-update {
        type string; boolean;
        mandatory true;
        description "IA type"; "client initiate";

      }
            leaf-list ipv6-addr
      leaf modify-name-from-cli {
        type inet:ipv6-address; boolean;
        mandatory true;
        description "ipv6 address"; "modify by client";
      }
            leaf-list ipv6-prefix {
              type inet:ipv6-prefix;
              description "ipv6 prefix";
    }
            leaf-list prefix-length
    container posix-timezone-option {
              type uint8;
      if-feature posix-timezone-op;
      presence "Enable this option";
      description "ipv6 prefix length";
            } "OPTION_NEW_POSIX_TIMEZONE (41) Posix Timezone option";
      reference "RFC4833: Timezone Options for DHCP";
      leaf t1-time tz-posix {
        type yang:timeticks; string;
        mandatory true;
        description "t1 time"; "TZ Posix IEEE 1003.1 String";
      }
    }
    container tzdb-timezone-option {
      if-feature tzdb-timezone-op;
      presence "Enable this option";
      description "OPTION_NEW_TZDB_TIMEZONE (42) Timezone Database option";
      reference "RFC4822: Timezone Options for DHCP";
      leaf t2-time tz-database {
        type yang:timeticks; string;
        mandatory true;
        description "t2 time"; "Reference to the TZ Database";
      }
    }
    container ntp-server-option {
      //This option looks like it needs work to correctly model the
      //option as defined in the RFC.

      // Zihao - Re-modelled so it only contains one
      // time source suboption

      if-feature ntp-server-op;
      presence "Enable this option";
      description "OPTION_NTP_SERVER (56) NTP Server Option for DHCPv6";
      reference "RFC5908: Network Time Protocol (NTP) Server Option for
      DHCPv6";
      list ntp-server {
        key ntp-serv-id;
        description "ntp server info";
        leaf preferred-lifetime ntp-serv-id {
          type yang:timeticks; uint8;
          mandatory true;
          description "preferred lifetime"; "ntp server id";

        }
            leaf valid-lifetime
        choice ntp-time-source-suboption {
          description "Select a NTP time source suboption.";
          case server-address {
        leaf-list ntp-serv-addr-suboption {
                  type yang:timeticks;
              mandatory true; inet:ipv6-address;
                  description "valid lifetime";
            } "ntp server addr";
                }
          }
        container if-other-paras
          case server-multicast-address {
          config "false";
            leaf-list ntp-serv-mul-addr-suboption {
                    type inet:ipv6-address;
                    description "A client can obtain
            extra configuration data other than
            address and prefix information through
            DHCPv6. This container describes such
            data the client was configured. The
            potential configuration data may
            include DNS server addresses, SIP "ntp server domain names, etc."; multicast addr";
                  }
          }
          case server-fqdn {
            leaf-list uni-dhcpv6-serv-addr ntp-serv-fqdn-suboption {
                    type inet:ipv6-address; string;
                    description "unicast "ntp server address"; fqdn";
                  }
          }
        }
      }
    }
    container dns-paras {
            description "dns parameters";
            leaf domain-search-list boot-file-url-option {
              type string;
              mandatory true;
      if-feature boot-file-url-op;
      presence "Enable this option";
      description "domain search list";
            } "OPT_BOOTFILE_URL (59) Boot File URL option";
      reference "RFC5970: DHCPv6 Options for Network Boot";
      list dns-servers boot-file {
        key dns-serv-id; boot-file-id;
        description "dns servers"; "boot file info";
        leaf dns-serv-id boot-file-id {
          type uint8;
          mandatory true;
          description "dns server "boot file id";
        }
            leaf-list suitable-arch-type {
                type uint16;
                description "architecture type";
              }
              leaf-list suitable-net-if {
                type uint32;
                description "network interface";
              }
        leaf dns-serv-addr boot-file-url {
          type inet:ipv6-address; string;
          mandatory true;
          description "dns server address"; "url for boot file";
        }
      }
    }
    container sip-paras boot-file-param-option {
      if-feature boot-file-param-op;
      presence "Enable this option";
      description "sip parameters"; "OPT_BOOTFiLE_PARAM (60) Boot File Parameters Option";
      reference "RFC5970: DHCPv6 Options for Network Boot";
          list sip-servers boot-file-paras {
              key sip-serv-id; para-id;
              description "sip server info"; "boot file parameters";
              leaf sip-serv-id para-id {
                type uint8;
                mandatory true;
                description "sip server "parameter id";
              }
              leaf sip-serv-addr parameter {
                type inet:ipv6-address; string;
                mandatory true;
                description "sip server address"; "parameter
                  value";
              }

            }
    }
    container aftr-name-option {
      if-feature aftr-name-op;
      presence "Enable this option";
      description "OPTION_AFTR_NAME (64) AFTR-Name DHCPv6 Option";
      reference "RFC6334: Dynamic Host Configuration Protocol for IPv6
      (DHCPv6) Option for Dual-Stack Lite";
      leaf sip-serv-domain-name tunnel-endpoint-name {
        type string;
        mandatory true;
        description
                  "sip server domain "aftr name";
      }
    }
          }
    container nis-paras kbr-default-name-option {
      if-feature kbr-default-name-op;
      presence "Enable this option";
      description "nis parameters"; "OPTION_KRB_DEFAULT_REALM_NAME (77) Kerberos Default Realm Name Option";
      reference "RFC6784: Kerberos Options for DHCPv6";
        leaf nis-domain-name default-realm-name {
            type string;
            mandatory true;
            description "nis domain "default realm name";
          }

    }
    container kbr-kdc-option {
      if-feature kbr-kdc-op;
      presence "Enable this option";
      description "OPTION_KRB_KDC (78) Kerberos KDB Option";
      reference "RFC6784: Kerberos Options for DHCPv6";
        list nis-server kdc-info {
            key nis-serv-id; kdc-id;
            description "nis server"; "kdc info";
            leaf nis-serv-id kdc-id {
              type uint8;
              mandatory true;
              description "nis server "kdc id";
            }
            leaf nis-serv-addr priority {
              type inet:ipv6-address; uint16;
              mandatory true;
              description "nis server address";
              }
            } "priority";
            }
          container nis-plus-paras {
            description "nisp parameters";
            leaf nis-plus-domain-name weight {
              type string; uint16;
              mandatory true;
              description "nisp domian name"; "weight";
            }
            list nis-plus-server {
              key nis-plus-serv-id;
              description "nisp server";
            leaf nis-plus-serv-id transport-type {
              type uint8;
              mandatory true;
              description "nisp server id";
              }
              leaf nis-plus-serv-addr {
                type inet:ipv6-address;
                mandatory true;
                description "nisp server address";
              }
            }
          }
          leaf info-refresh-time {
            type yang:timeticks;
            description "info refresh time"; "transport type";
            }
          container time-zone-paras {
            description "time zone parameters";
            leaf tz-posix port-number {
              type string; uint16;
              mandatory true;
              description "tz posix"; "port number";
            }
            leaf tz-database kdc-ipv6-addr {
              type string; inet:ipv6-address;
              mandatory true;
              description "tz database";
            } "kdc ipv6 addr";
            }
            leaf cli-fqdn realm-name {
              type string;
              mandatory true;
              description "client fqdn"; "realm name";
            }
          }
    }
    container ntp-paras {
            description "ntp parameters";
            list ntp-server sol-max-rt-option {
              key ntp-serv-id;
      if-feature sol-max-rt-op;
      presence "Enable this option";
      description "ntp server"; "OPTION_SOL_MAX_RT (82) sol max rt option";
      reference "RFC7083: Modification to Default Values of
        SOL_MAX_RT and INF_MAX_RT";
        leaf ntp-serv-id sol-max-rt-value {
          type uint8; yang:timeticks;
          mandatory true;
          description "ntp server id"; "sol max rt value";
        }
    }
    container inf-max-rt-option {
      if-feature inf-max-rt-op;
      presence "Enable this option";
      description "OPTION_INF_MAX_RT (83) inf max rt option";
      reference "RFC7083: Modification to Default Values of
        SOL_MAX_RT and INF_MAX_RT";
      leaf ntp-serv-addr inf-max-rt-value {
        type inet:ipv6-address; yang:timeticks;
        mandatory true;
        description "ntp server address"; "inf max rt value";
      }
    }
    container addr-selection-option {
      if-feature addr-selection-op;
      presence "Enable this option";
      description "OPTION_ADDRSEL (84) and OPTION_ADDRSEL_TABLE (85)";
      reference "RFC7078: Distributing Address Selection Policy Using
      DHCPv6";
      // if - Needs checking to see if this matches the RFC - there
      // are two options here.
      // Zihao - I think this matches RFC7078
      leaf ntp-serv-mul-addr a-bit-set {
        type inet:ipv6-address; boolean;
        mandatory true;
        description "ntp server multicast
                  address"; "a bit";
      }
      leaf ntp-serv-fqdn p-bit-set {
        type string; boolean;
        mandatory true;
        description "ntp server fqdn";
              }
            } "p bit";
      }
          container sntp-paras {
            description "sntp parameters";
      list sntp-server policy-table {
        key sntp-serv-id; policy-id;
        description "sntp server"; "policy table";
        leaf sntp-serv-id policy-id {
          type uint8;
          mandatory true;
          description "sntp server "policy id";

        }
        leaf sntp-serv-addr label {
          type inet:ipv6-address; uint8;
          mandatory true;
          description "sntp server address";
              }
            } "label";
        }
          container network-boot-paras {
            description "network boot parameters";
            list boot-file {
              key boot-file-id;
              description "boot file";
        leaf boot-file-id precedence {
          type uint8;
          mandatory true;
          description "boot file id";
              }
              leaf-list suitable-arch-type {
                type uint16;
                description "architecture type"; "precedence";
        }
              leaf-list suitable-net-if
        leaf prefix-len {
          type uint32; uint8;
          mandatory true;
          description "network interface"; "prefix length";
        }
        leaf boot-file-url prefix {
          type string; inet:ipv6-prefix;
          mandatory true;
          description "boot file url"; "prefix";
        }
      }
    }
    container pcp-server-option {
      if-feature pcp-server-op;
      presence "Enable this option";
      description "OPTION_V6_PCP_SERVER (86)
        pcp server option";
      reference "RFC7291: DHCP Options for the Port Control
        Protocol (PCP)";
      list boot-file-paras pcp-server {
        key para-id; pcp-serv-id;
        description "boot file parameters"; "pcp server info";
        leaf para-id pcp-serv-id {
          type uint8;
          mandatory true;
          description "parameter "pcp server id";
        }
        leaf parameter pcp-serv-addr {
          type string; inet:ipv6-address;
          mandatory true;
          description "parameter value";
                } "pcp server addr";
        }
      }
    }
    container kerberos-paras {
            description "kerberos parameters";
            leaf default-realm-name s46-rule-option {
              type string;
              mandatory true;
      if-feature s46-rule-op;
      presence "Enable this option";
      description "default realm name";
            } "OPTION_S46_RULE (89) S46 rule option";
      reference "RFC7598: DHCPv6 Options for Configuration of
        Softwire Address and Port-Mapped Clients";
      list kdc-info s46-rule {
        key kdc-id; rule-id;
        description "kdc info"; "s46 rule";
        leaf kdc-id rule-id {
          type uint8;
          mandatory true;
          description "kdc "rule id";
        }
        leaf priority rule-type {
          type uint16;
                mandatory true; enumeration {
            enum "BMR" {
            description "priority"; "BMR";
          }
              leaf weight
          enum "FMR" {
                type uint16;
            description "FMR";
          }
        }
        mandatory true;
        description "weight"; "rule type";
      }
      leaf transport-type prefix4-len {
        type uint8;
        mandatory true;
        description "transport type"; "ipv4 prefix length";
      }
        leaf port-number ipv4-prefix {
          type uint16; inet:ipv4-prefix;
          mandatory true;
          description "port number"; "ipv4 prefix";
        }
        leaf kdc-ipv6-addr prefix6-len {
          type inet:ipv6-address; uint8;
          mandatory true;
          description "kdc ipv6 address"; "ipv6 prefix length";
        }
        leaf realm-name ipv6-prefix {
          type string; inet:ipv6-prefix;
          mandatory true;
          description "realm name"; "ipv6 prefix";
        }
        uses portset-para;
      }
    }
    container addr-selection-paras s46-br-option {
      if-feature s46-br-op;
      presence "Enable this option";
      description "address selection parameters"; "OPTION_S46_BR (90) S46 BR Option";
      reference "RFC7598: DHCPv6 Options for Configuration of
        Softwire Address and Port-Mapped Clients";
      list br {
        key br-id;
        description "br info";
        leaf automatic-row-add br-id {
          type boolean; uint8;
          mandatory true;
          description "row add"; "br id";
        }
        leaf prefer-temporary-addr br-ipv6-addr {
          type boolean; inet:ipv6-address;
          mandatory true;
          description "prefer temporary"; "br ipv6 addr";
        }
      }
    }
    container s46-dmr-option {
      if-feature s46-dmr-op;
      presence "Enable this option";
      description "OPTION_S46_DMR (91) S46 DMR Option";
      reference "RFC7598: DHCPv6 Options for Configuration of
        Softwire Address and Port-Mapped Clients";
      list policy-table dmr {
        key policy-id; dmr-id;
        description "policy table"; "dmr info";
        leaf policy-id dmr-id {
          type uint8;
          mandatory true;
          description "policy id "; "dmr id";
        }
        leaf label dmr-prefix-len {
          type uint8;
          mandatory true;
          description "label"; "dmr prefix length";
        }
        leaf precedence dmr-ipv6-prefix {
          type uint8; inet:ipv6-prefix;
          mandatory true;
          description "precedence"; "dmr ipv6 prefix";
        }
      }
    }
    container s46-v4-v6-binding-option {
      if-feature s46-v4-v6-binding-op;
      presence "Enable this option";
      description "OPTION_S46_V4V6BIND (92) S46 IPv4/IPv6 Address
        Binding option";
      reference "RFC7598: DHCPv6 Options for Configuration of
        Softwire Address and Port-Mapped Clients";
      list ce {
        key ce-id;
        description "ce info";
        leaf prefix-len ce-id {
          type uint8;
          mandatory true;
          description "prefix length"; "ce id";
        }
        leaf prefix ipv4-addr {
          type inet:ipv6-prefix; inet:ipv4-address;
          mandatory true;
          description "prefix";
              }
            } "ce ipv4 addr";
        }
        leaf sol-max-rt bind-prefix6-len {
          type yang:timeticks; uint8;
          mandatory true;
          description "sol max rt"; "bind ipv6 prefix
            length";
        }
        leaf inf-max-rt bind-ipv6-prefix {
          type yang:timeticks; inet:ipv6-prefix;
          mandatory true;
          description "inf max rt"; "bind ipv6 prefix";
        }
        uses portset-para;
      }
    }
  }
  //if - NB - The list of options needs to be updated.

  grouping relay-supplied-option-definitions {
    // if - The structure here needs to be checked and probably reworked.
    description "OPTION_RSOO (66) Relay-Supplied Options option";
    reference "RFC6422: Relay-Supplied DHCP Options";
    container pcp-server-paras erp-local-domain-name-option {
      if-feature erp-local-domain-name-op;
      presence "Enable this option";
      description "pcp server parameters"; "OPTION_ERP_LOCAL_DOMAIN_NAME (65) DHCPv6 ERP Local
        Domain Name Option";
      reference "RFC6440: The EAP Re-authentication Protocol (ERP)
        Local Domain Name DHCPv6 Option";
      list pcp-server erp-for-client {
        key pcp-serv-id; cli-id;
        description "pcp server"; "erp for client";
        leaf pcp-serv-id cli-id {
          type uint8; uint32;
          mandatory true;
          description "pcp server "client id";
        }
        container duid {
          description "Sets the DUID";
          // uses duid;
          // if - Maybe DUID definition needs to be moved to this module.
          uses duid;
        }
        leaf pcp-serv-addr erp-name {
          type inet:ipv6-address; string;
          mandatory true;
          description "pcp server address"; "erp name";
        }
      }
    }
          container s46-rule-paras
  }

  grouping client-option-definitions {
    description "s46 rule parameters"; "Contains definitions for options configured on the
      DHCPv6 client which will be sent to the server.";
    list s46-rule new-or-standard-cli-option {
      key rule-id; option-code;
      description "s46 rule"; "new or standard client option";
      leaf rule-id option-code {
        type uint8; uint16;
        mandatory true;
        description "rule id"; "option code";
      }
      leaf rule-type option-name {
        type enumeration {
                  enum "BMR"{
                    description "BMR";
                }
                enum "FMR"{
                  description "FMR";
                }
                } string;
        mandatory true;
        description "rule type"; "option name";
      }
      leaf ea-len option-description {
        type uint8; string;
        mandatory true;
        description "EA bits length"; "description of client
          option";
      }
      leaf prefix4-len option-reference {
        type uint8;
                mandatory true; string;
        description "ipv4 prefix length"; "the reference of option";
      }
      leaf ipv4-prefix option-value {
        type inet:ipv4-prefix; string;
        mandatory true;
        description "ipv4 prefix"; "the option value";
      }
    }
    container option-request-option {
      if-feature option-request-op;
      presence "Enable this option";
      description "OPTION_ORO (6) Option Request Option";
      reference "RFC3315: Dynamic Host Configuration Protocol
      for IPv6 (DHCPv6)";
      list oro-option {
        key option-code;
        description "oro option";
        leaf prefix6-len option-code {
          type uint8; uint16;
          mandatory true;
          description "ipv6 prefix length"; "option code";
        }
        leaf ipv6-prefix description {
          type inet:ipv6-prefix; string;
          mandatory true;
          description "ipv6 prefix"; "description of oro
            options";
        }
              uses portset-para;
      }
    }

    container s46-br-paras user-class-option {
            description "s46 br parameters";
      if-feature user-class-op;
      presence "Enable this option";
      description "OPTION_USER_CLASS (15) User Class Option";
      reference "RFC3315: Dynamic Host Configuration Protocol
      for IPv6 (DHCPv6)";
      list br user-class {
        key br-id; user-class-id;
        description "br"; "user class";
        leaf br-id user-class-id {
          type uint8;
          mandatory true;
          description "br "user class id";
        }
        leaf br-ipv6-addr user-class-data {
          type inet:ipv6-address; string;
          mandatory true;
          description "br ipv6 address"; "The information contained in the data area
            of this option is contained in one or more opaque
            fields that represent the user class or classes of
            which the client is a member. ";

        }
      }
    }
    container s46-dmr-paras {
            description "s46 dmr parameters";
            list dmr vendor-class-option {
              key dmr-id;
      if-feature vendor-class-op;
      presence "Enable this option";
      description "dmr"; "OPTION_VENDOR_CLASS (16) Vendor Class Option";
      reference "RFC3315: Dynamic Host Configuration Protocol
      for IPv6 (DHCPv6)";
      leaf dmr-id enterprise-number {
        type uint8; uint32;
        mandatory true;
        description "dmr id"; "enterprise number";
      }
      list vendor-class {
        key vendor-class-id;
        description "vendor class";
          leaf dmr-prefix-len vendor-class-id {
              type uint8;
              mandatory true;
              description "dmr prefix length"; "vendor class id";
            }
          leaf dmr-ipv6-prefix vendor-class-data {
            type inet:ipv6-prefix; string;
            mandatory true;
            description "dmr prefix"; "The vendor-class-data is composed of a series
                  of separate items, each of which describes some
                  characteristic of the client's hardware configuration.
                  Examples of vendor-class-data instances might include the
                  version of the operating system the client is running or
                  the amount of memory installed on the client.";
          }
      }
    }
    container s46-v4-v6-binding-paras client-fqdn-option {
      if-feature client-fqdn-op;
      presence "Enable this option";
      description "s46 v4 v6 binding parameters"; "OPTION_CLIENT_FQDN (39) The Dynamic Host
        Configuration Protocol for IPv6 (DHCPv6) Client Fully
        Qualified Domain Name (FQDN) Option";
      reference "RFC4704: The Dynamic Host Configuration Protocol
        for IPv6 (DHCPv6) Client Fully Qualified Domain Name (FQDN)
        Option";
      leaf ipv4-addr fqdn {
        type inet:ipv4-address; string;
        mandatory true;
        description "ipv4 address"; "fqdn";
      }
      leaf bind-prefix6-len server-initiate-update {
        type uint8; boolean;
        mandatory true;
        description "bind ipv6 prefix"; "whether server initiate";
      }
            uses portset-para;
      leaf erp-local-domain-name client-initiate-update {
        type string; boolean;
        mandatory true;
        description "erp local domain name"; "whether client initiate";
      }
    }
    container supported-options client-arch-type-option {
      if-feature client-arch-type-op;
      presence "Enable this option";
      description "supported options"; "OPTION_CLIENT_ARCH_TYPE (61) Client System
        Architecture Type Option";
      reference "RFC5970: DHCPv6 Options for Network Boot";
      list supported-option architecture-types {
        key option-code; type-id;
        description "supported option"; "architecture types";
        leaf option-code type-id {
          type uint16;
          mandatory true;
          description "option code"; "type id";
        }
        leaf description most-preferred {
          type string; boolean;
          mandatory true;
          description
                  "description of supported
                  option";
              } "most preferred flag";
        }
      }
    }
    container packet-stats client-network-interface-identifier-option {
          config "false";
      if-feature client-network-interface-identifier-op;
      presence "Enable this option";
      description "A container records
            all the packet status information
            of a specific interface."; "OPTION_NII (62) Client Network Interface
        Identifier Option";
      reference "RFC5970: DHCPv6 Options for Network Boot";
      leaf solicit-count type {
        type uint32; uint8;
        mandatory true;
        description "solicit counter"; "type";
      }
      leaf request-count major {
        type uint32; uint8;
        mandatory true;
        description "request counter"; "major";
      }
      leaf renew-count minor {
        type uint32; uint8;
        mandatory true;
        description "renew counter"; "minor";
      }
          leaf rebind-count
    }
    container kbr-principal-name-option {
            type uint32;
            mandatory true;
      if-feature kbr-principal-name-op;
      presence "Enable this option";
      description "rebind counter";
          }
          leaf decline-count "OPTION_KRB_PRINCIPAL_NAME (75) Kerberos
        Principal Name Option";
      reference "RFC6784: Kerberos Options for DHCPv6";
      list principle-name {
            type uint32;
            mandatory true;
        key principle-name-id;
        description "decline counter";
          } "principle name";
        leaf release-count principle-name-id {
          type uint32; uint8;
          mandatory true;
          description "release counter"; "principle name id";
        }
        leaf info-req-count name-type {
          type uint32; int32;
          mandatory true;
          description "information request counter"; "This field specifies the type of name that follows.";
        }
        leaf advertise-count name-string {
          type uint32; string;
          mandatory true;
          description "advertise counter"; "This field encodes a sequence of components that form
            a name, each component encoded as a KerberoString";
        }
      }
      }
    container kbr-realm-name-option {
      if-feature kbr-realm-name-op;
      presence "Enable this option";
      description "OPTION_KRB_REALM_NAME (76) Kerberos Realm Name Option";
      reference "RFC6784: Kerberos Options for DHCPv6";
      leaf confirm-count realm-name {
        type uint32; string;
        mandatory true;
        description "confirm counter"; "realm name";
      }
    }
    container client-link-layer-addr-option {
      if-feature client-link-layer-addr-op;
      presence "Enable this option";
      description "OPTION_CLIENT_LINKLAYER_ADDR (79) DHCPv6 Client
        Link-Layer Address Option";
      reference "RFC6939: Client Link-Layer Address Option in
        DHCPv6";
      leaf reply-count link-layer-type {
        type uint32; uint16;
        mandatory true;
        description "reply counter"; "Client link-layer address type. The link-layer
          type MUST be a valid hardware type assigned by the IANA,
          as described in [RFC0826]";
      }
      leaf reconfigure-count link-layer-addr {
        type uint32; string;
        mandatory true;
        description "recofigure counter";
          } "Client link-layer address";
      }
    }
    }

    /*
     * Notifications
     */

    notification notifications

  grouping custom-option-definitions {
  description "dhcpv6 notification module"; "operator customized options";
    container dhcpv6-server-event operator-option-ipv6-address {
      if-feature operator-op-ipv6-address;
      presence "Enable this option";
      description "dhcpv6 server event";
        container pool-running-out "operator ipv6 address option";
      reference "RFC7227: Guidelines for Creating New DHCPv6 Options";
      list operator-ipv6-addr {
        key operator-ipv6-addr-id;
        description "raised 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"; "operator ipv6 address info";
        leaf utilization-ratio operator-ipv6-addr-id {
          type uint16; uint8;
          mandatory true;
          description "utilization ratio"; "operator ipv6 address id";
        }
          container duid
        leaf operator-ipv6-addr {
          type inet:ipv6-address;
          mandatory true;
          description "Sets the DUID";
            uses duid; "operator ipv6 address id";
        }
      }
    }
    container operator-option-single-flag {
      if-feature operator-op-single-flag;
      presence "Enable this option";
      description "operator single flag";
      reference "RFC7227: Guidelines for Creating New DHCPv6
        Options";

      list flag {
        key flag-id;
        description "operator single flag info";
        leaf serv-name flag-id {
          type string; uint8;
          mandatory true;
          description "server name"; "operator single flag id";
        }
        leaf pool-name { flag-value{
          type string; boolean;
          mandatory true;
          description "pool name"; "operator single flag value";
        }
      }
    }
    container invalid-client-detected operator-option-ipv6-prefix {
      if-feature operator-op-ipv6-prefix;
      presence "Enable this option";
      description "raised when the server
            has found a client which can be
            regarded as a potential attacker. Some "operator ipv6 prefix option";
      reference "RFC7227: Guidelines for Creating New DHCPv6
        Options";
      list operator-ipv6-prefix{
        key operator-ipv6-prefix-id;
        description could also be included.";
          container duid "operator ipv6 prefix info";
        leaf operator-ipv6-prefix-id {
          type uint8;
          mandatory true;
          description "Sets the DUID";
            uses duid; "operator ipv6 prefix id";
        }
        leaf operator-ipv6-prefix6-len{
          type uint8;
          mandatory true;
          description "operator ipv6 prefix length";
        }
        leaf operator-ipv6-prefix {
          type string; inet:ipv6-prefix;
          mandatory true;
          description "description of the event"; "operator ipv6 prefix";
        }
      }
    }
    container dhcpv6-relay-event operator-option-int32 {
      if-feature operator-op-int32;
      presence "Enable this option";
      description "dhcpv6 relay event";
        container topo-changed { "operator integer 32 option";
      reference "RFC7227: Guidelines for Creating New DHCPv6
        Options";
      list int32val{
        key int32val-id;
        description "raised when the topology
            of the relay agent is changed."; "operator integer 32 info";
        leaf relay-if-name int32val-id {
          type string; uint8;
          mandatory true;
          description "relay interface name"; "operator integer 32 id";
        }
        leaf int32val{
          type uint32;
          mandatory true;
          description "operator integer 32 value";
        }
      }
    }
    container operator-option-int16 {
      if-feature operator-op-int16;
      presence "Enable this option";
      description "operator integer 16 option";
      reference "RFC7227: Guidelines for Creating New DHCPv6
        Options";
      list int16val{
        key int16val-id;
        description "operator integer 16 info";
        leaf first-hop int16val-id {
          type boolean; uint8;
          mandatory true;
          description "first hop"; "operator integer 16 id";
        }
        leaf last-entity-addr { int16val{
          type inet:ipv6-address; uint16;
          mandatory true;
          description "last entity address"; "operator integer 16 value";
        }
      }
    }
    container dhcpv6-client-event operator-option-int8 {
      if-feature operator-op-int8;
      presence "Enable this option";
      description "dhcpv6 client event";
        container ia-lease-event { "operator integer 8 option";
      reference "RFC7227: Guidelines for Creating New DHCPv6
        Options";
      list int8val{
        key int8val-id;
        description "raised when the
            client was allocated a new IA from
            the server or it renew/rebind/release
            its current IA"; "operator integer 8 info";
        leaf event-type int8val-id {
          type enumeration{
              enum "allocation" {
                description "allocate";
              }
              enum "rebind" {
                description "rebind";
              }
              enum "renew" {
                description "renew";
              }
              enum "release" {
                description "release";
              }
            } uint8;
          mandatory true;
          description "event type";
          }
          container duid {
            description "Sets the DUID";
            uses duid; "operator integer 8 id";

        }
        leaf iaid { int8val{
          type uint32; uint8;
          mandatory true;
          description "IAID";
          }
          leaf serv-name {
            type string;
            description "server name"; "operator integer 8 value";
        }
          leaf description {
            type string;
            description "description of event";
      }
    }
    container invalid-ia-detected operator-option-uri {
      if-feature operator-op-uri;
      presence "Enable this option";
      description "raised when the identity
            association of the client can be proved
            to be invalid.  Possible condition includes
            duplicated address, illegal address, etc.";
          container duid { "operator uri option";
      reference "RFC7227: Guidelines for Creating New DHCPv6
        Options";
      list uri{
        key uri-id;
        description "Sets the DUID";
            uses duid;
          } "operator uri info";
        leaf cli-duid uri-id {
          type uint32; uint8;
          mandatory true;
          description "duid of client"; "operator uri id";
        }
        leaf iaid { uri{
          type uint32; string;
          mandatory true;
          description "IAID"; "operator uri value";
        }
      }
    }
    container operator-option-textstring {
      if-feature operator-op-textstring;
      presence "Enable this option";
      description "operator itext string option";
      reference "RFC7227: Guidelines for Creating New DHCPv6 Options";
      list textstring{
        key textstring-id;
        description "operator text string info";
        leaf serv-name textstring-id {
          type string; uint8;
          mandatory true;
          description "server name"; "operator text string id";
        }
        leaf description { textstring{
          type string;
          mandatory true;
          description "description of the event"; "operator text string value";
        }
      }

    }
    container retransmission-failed operator-option-var-data {
      if-feature operator-op-var-data;
      presence "Enable this option";
      description "raised when the retransmission
            mechanism defined in [RFC3315] is failed.";
          container duid { "operator variable length data option";
      reference "RFC7227: Guidelines for Creating New DHCPv6 Options";
      list int32val{
        key var-data-id;
        description "Sets the DUID";
            uses duid;
          } "operator ivariable length data info";
        leaf description var-data-id {
          type enumeration {
              enum "MRC failed" {
                description "MRC failed";
              }
              enum "MRD failed" { uint8;
          mandatory true;
          description "MRD failed";
              } "operator variable length id";
        }
        leaf var-data{
          type binary;
          mandatory true;
          description "description of failure"; "operator variable length value";
        }
      }
    }
    container failed-status-turn-up operator-option-dns-wire {
      if-feature operator-op-dns-wire;
      presence "Enable this option";
      description "raised when the client receives
            a message includes an unsuccessful Status Code
            option.";
          container duid { "operator dns wire format domain name list option";
      reference "RFC7227: Guidelines for Creating New DHCPv6
        Options";
      list operator-option-dns-wire{
        key operator-option-dns-wire-id;
        description "Sets the DUID";
            uses duid;
          } "operator dns wire format info";
        leaf status-code operator-option-dns-wire-id {
          type enumeration {
              enum "1" {
                description "UnspecFail";
              }
              enum "2" {
                description "NoAddrAvail";
              }
              enum "3" {
                description "NoBinding";
              }
              enum "4" {
                description "NotOnLink";
              }
              enum "5" { uint8;
          mandatory true;
          description "UseMulticast";
              } "operator dns wire format id";
        }
        leaf operator-option-dns-wire{
          type binary;
          mandatory true;
          description "employed status code"; "operator dns wire format value";
        }
      }
    }
  }
}

<CODE ENDS>
4.  Security Considerations (TBD)

   TBD

5.  IANA Considerations (TBD)

   This document registers the following YANG modules in the "YANG
   Module Names" registry [RFC6020].

   name:           ietf-dhcpv6
   namespace:      urn:ietf:params:xml:ns:yang:ietf-dhcpv6
   prefix:         dhcpv6
   reference:      TBD

6.  Acknowledgements

   The authors would like to thank Qi Sun, Lishan Li, Sladjana Zoric,
   Tomek Mrugalski, Marcin Siodelski, Bernie Volz and Bing Liu for their
   valuable comments and contributions to this work.

7.  Contributors

   The following individuals contributed to this effort:
     Hao Wang
     Tsinghua University
     Beijing 100084
     P.R.China
     Phone: +86-10-6278-5822
     Email: wangh13@mails.tsinghua.edu.cn

     Ted Lemon
     Nomium, Inc
     950 Charter St.
     Redwood City, CA 94043
     USA
     Email: Ted.Lemon@nomium.com

8.  References

7.1.

8.1.  Normative References

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119,
              DOI 10.17487/RFC2119, March 1997,
              <https://www.rfc-editor.org/info/rfc2119>.

   [RFC3315]  Droms, R., Ed., Bound, J., Volz, B., Lemon, T., Perkins,
              C., and M. Carney, "Dynamic Host Configuration Protocol
              for IPv6 (DHCPv6)", RFC 3315, DOI 10.17487/RFC3315, July
              2003, <https://www.rfc-editor.org/info/rfc3315>.

   [RFC3633]  Troan, O. and R. Droms, "IPv6 Prefix Options for Dynamic
              Host Configuration Protocol (DHCP) version 6", RFC 3633,
              DOI 10.17487/RFC3633, December 2003,
              <https://www.rfc-editor.org/info/rfc3633>.

   [RFC6020]  Bjorklund, M., Ed., "YANG - A Data Modeling Language for
              the Network Configuration Protocol (NETCONF)", RFC 6020,
              DOI 10.17487/RFC6020, October 2010,
              <https://www.rfc-editor.org/info/rfc6020>.

   [RFC6087]  Bierman, A., "Guidelines for Authors and Reviewers of YANG
              Data Model Documents", RFC 6087, DOI 10.17487/RFC6087,
              January 2011, <https://www.rfc-editor.org/info/rfc6087>.

   [RFC6355]  Narten, T. and J. Johnson, "Definition of the UUID-Based
              DHCPv6 Unique Identifier (DUID-UUID)", RFC 6355,
              DOI 10.17487/RFC6355, August 2011,
              <https://www.rfc-editor.org/info/rfc6355>.

   [RFC6991]  Schoenwaelder, J., Ed., "Common YANG Data Types",
              RFC 6991, DOI 10.17487/RFC6991, July 2013,
              <https://www.rfc-editor.org/info/rfc6991>.

7.2.

8.2.  Informative References

   [I-D.ietf-netmod-yang-tree-diagrams]
              Bjorklund, M. and L. Berger, "YANG Tree Diagrams", draft-
              ietf-netmod-yang-tree-diagrams-02
              ietf-netmod-yang-tree-diagrams-04 (work in progress),
              October
              December 2017.

   [RFC3319]  Schulzrinne, H. and B. Volz, "Dynamic Host Configuration
              Protocol (DHCPv6) Options for Session Initiation Protocol
              (SIP) Servers", RFC 3319, DOI 10.17487/RFC3319, July 2003,
              <https://www.rfc-editor.org/info/rfc3319>.

   [RFC3646]  Droms, R., Ed., "DNS Configuration options for Dynamic
              Host Configuration Protocol for IPv6 (DHCPv6)", RFC 3646,
              DOI 10.17487/RFC3646, December 2003,
              <https://www.rfc-editor.org/info/rfc3646>.

   [RFC3898]  Kalusivalingam, V., "Network Information Service (NIS)
              Configuration Options for Dynamic Host Configuration
              Protocol for IPv6 (DHCPv6)", RFC 3898,
              DOI 10.17487/RFC3898, October 2004,
              <https://www.rfc-editor.org/info/rfc3898>.

   [RFC4075]  Kalusivalingam, V., "Simple Network Time Protocol (SNTP)
              Configuration Option for DHCPv6", RFC 4075,
              DOI 10.17487/RFC4075, May 2005,
              <https://www.rfc-editor.org/info/rfc4075>.

   [RFC4242]  Venaas, S., Chown, T., and B. Volz, "Information Refresh
              Time Option for Dynamic Host Configuration Protocol for
              IPv6 (DHCPv6)", RFC 4242, DOI 10.17487/RFC4242, November
              2005, <https://www.rfc-editor.org/info/rfc4242>.

   [RFC4704]  Volz, B., "The Dynamic Host Configuration Protocol for
              IPv6 (DHCPv6) Client Fully Qualified Domain Name (FQDN)
              Option", RFC 4704, DOI 10.17487/RFC4704, October 2006,
              <https://www.rfc-editor.org/info/rfc4704>.

   [RFC4833]  Lear, E. and P. Eggert, "Timezone Options for DHCP",
              RFC 4833, DOI 10.17487/RFC4833, April 2007,
              <https://www.rfc-editor.org/info/rfc4833>.

   [RFC5908]  Gayraud, R. and B. Lourdelet, "Network Time Protocol (NTP)
              Server Option for DHCPv6", RFC 5908, DOI 10.17487/RFC5908,
              June 2010, <https://www.rfc-editor.org/info/rfc5908>.

   [RFC5970]  Huth, T., Freimann, J., Zimmer, V., and D. Thaler, "DHCPv6
              Options for Network Boot", RFC 5970, DOI 10.17487/RFC5970,
              September 2010, <https://www.rfc-editor.org/info/rfc5970>.

   [RFC6334]  Hankins, D. and T. Mrugalski, "Dynamic Host Configuration
              Protocol for IPv6 (DHCPv6) Option for Dual-Stack Lite",
              RFC 6334, DOI 10.17487/RFC6334, August 2011,
              <https://www.rfc-editor.org/info/rfc6334>.

   [RFC6422]  Lemon, T. and Q. Wu, "Relay-Supplied DHCP Options",
              RFC 6422, DOI 10.17487/RFC6422, December 2011,
              <https://www.rfc-editor.org/info/rfc6422>.

   [RFC6440]  Zorn, G., Wu, Q., and Y. Wang, "The EAP Re-authentication
              Protocol (ERP) Local Domain Name DHCPv6 Option", RFC 6440,
              DOI 10.17487/RFC6440, December 2011,
              <https://www.rfc-editor.org/info/rfc6440>.

   [RFC6784]  Sakane, S. and M. Ishiyama, "Kerberos Options for DHCPv6",
              RFC 6784, DOI 10.17487/RFC6784, November 2012,
              <https://www.rfc-editor.org/info/rfc6784>.

   [RFC6939]  Halwasia, G., Bhandari, S., and W. Dec, "Client Link-Layer
              Address Option in DHCPv6", RFC 6939, DOI 10.17487/RFC6939,
              May 2013, <https://www.rfc-editor.org/info/rfc6939>.

   [RFC7078]  Matsumoto, A., Fujisaki, T., and T. Chown, "Distributing
              Address Selection Policy Using DHCPv6", RFC 7078,
              DOI 10.17487/RFC7078, January 2014,
              <https://www.rfc-editor.org/info/rfc7078>.

   [RFC7083]  Droms, R., "Modification to Default Values of SOL_MAX_RT
              and INF_MAX_RT", RFC 7083, DOI 10.17487/RFC7083, November
              2013, <https://www.rfc-editor.org/info/rfc7083>.

   [RFC7227]  Hankins, D., Mrugalski, T., Siodelski, M., Jiang, S., and
              S. Krishnan, "Guidelines for Creating New DHCPv6 Options",
              BCP 187, RFC 7227, DOI 10.17487/RFC7227, May 2014,
              <https://www.rfc-editor.org/info/rfc7227>.

   [RFC7291]  Boucadair, M., Penno, R., and D. Wing, "DHCP Options for
              the Port Control Protocol (PCP)", RFC 7291,
              DOI 10.17487/RFC7291, July 2014,
              <https://www.rfc-editor.org/info/rfc7291>.

   [RFC7598]  Mrugalski, T., Troan, O., Farrer, I., Perreault, S., Dec,
              W., Bao, C., Yeh, L., and X. Deng, "DHCPv6 Options for
              Configuration of Softwire Address and Port-Mapped
              Clients", RFC 7598, DOI 10.17487/RFC7598, July 2015,
              <https://www.rfc-editor.org/info/rfc7598>.

Authors' Addresses

   Yong Cui
   Tsinghua University
   Beijing  100084
   P.R.China

   Phone: +86-10-6260-3059
   Email: yong@csnet1.cs.tsinghua.edu.cn

   Hao Wang
   Tsinghua University
   Beijing  100084
   P.R.China

   Phone: +86-10-6278-5822
   Email: wangh13@mails.tsinghua.edu.cn
   Linhui Sun
   Tsinghua University
   Beijing  100084
   P.R.China

   Phone: +86-10-6278-5822
   Email: lh.sunlinh@gmail.com

   Ian Farrer
   Deutsche Telekom AG
   CTO-ATI, Landgrabenweg 151
   Bonn, NRW  53227
   Germany

   Email: ian.farrer@telekom.de

   Sladjana Zechlin
   Deutsche Telekom AG
   CTO-IPT, Landgrabenweg 151
   Bonn, NRW  53227
   Germany

   Email: sladjana.zechlin@telekom.de

   Zihao He
   Tsinghua University
   Beijing  100084
   P.R.China

   Phone: +86-10-6278-5822
   Email: hezihao9512@gmail.com