]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3907] updated yang modules
authorRazvan Becheriu <razvan@isc.org>
Tue, 17 Jun 2025 10:22:11 +0000 (13:22 +0300)
committerRazvan Becheriu <razvan@isc.org>
Fri, 20 Jun 2025 13:29:10 +0000 (13:29 +0000)
34 files changed:
doc/examples/kea4/all-keys-netconf.json
doc/examples/kea6/all-keys-netconf.json
doc/examples/kea6/classify.json
doc/examples/kea6/classify2.json
src/bin/dhcp4/tests/parser_unittest.cc
src/bin/dhcp6/tests/parser_unittest.cc
src/lib/yang/adaptor_config.cc
src/lib/yang/adaptor_config.h
src/lib/yang/tests/config_unittests.cc
src/lib/yang/tests/translator_class_unittests.cc
src/lib/yang/translator_class.cc
src/lib/yang/translator_class.h
src/lib/yang/translator_config.cc
src/lib/yang/translator_host.cc
src/lib/yang/translator_option_data.cc
src/lib/yang/translator_pd_pool.cc
src/lib/yang/translator_pd_pool.h
src/lib/yang/translator_pool.cc
src/lib/yang/translator_pool.h
src/lib/yang/translator_shared_network.cc
src/lib/yang/translator_shared_network.h
src/lib/yang/translator_subnet.cc
src/lib/yang/translator_subnet.h
src/lib/yang/yang_revisions.h
src/share/yang/modules/hashes/kea-dhcp-types@2024-05-29.hash [deleted file]
src/share/yang/modules/hashes/kea-dhcp-types@2025-06-25.hash [new file with mode: 0644]
src/share/yang/modules/hashes/kea-dhcp4-server@2024-05-29.hash [deleted file]
src/share/yang/modules/hashes/kea-dhcp4-server@2025-06-25.hash [new file with mode: 0644]
src/share/yang/modules/hashes/kea-dhcp6-server@2024-05-29.hash [deleted file]
src/share/yang/modules/hashes/kea-dhcp6-server@2025-06-25.hash [new file with mode: 0644]
src/share/yang/modules/kea-dhcp-types@2025-06-25.yang [moved from src/share/yang/modules/kea-dhcp-types@2024-05-29.yang with 90% similarity]
src/share/yang/modules/kea-dhcp4-server@2025-06-25.yang [moved from src/share/yang/modules/kea-dhcp4-server@2024-05-29.yang with 90% similarity]
src/share/yang/modules/kea-dhcp6-server@2025-06-25.yang [moved from src/share/yang/modules/kea-dhcp6-server@2024-05-29.yang with 87% similarity]
src/share/yang/modules/meson.build

index 91d6164f56ddc3ea7369710884d54289d4ee28c9..fbf45b126269d4e0b370ce749e03efcd715caab2 100644 (file)
                 "name": "late",
 
                 // Boolean flag indicating whether the class expression is only evaluated
-                // when the class is required, e.g. the selected address pool configuration
-                // includes this class name in its "require-client-classes" list. The
+                // when the selected configuration (i.e. pool, subnet, shared-network)
+                // includes this class name in its "evaluate-additional-classes" list. The
                 // default value false means that the class test expression must
                 // always be evaluated.
-                "only-if-required": true,
+                "only-in-additional-list": true,
 
                 // Class selection expression.
                 "test": "member('ALL')"
         // to use for the DNS TTL.
         "ddns-ttl-percent": 0.75,
 
+        // When greater than 0 it will be used as the DNS TTL. Specified in seconds.
+        // You cannot specify both ddns-ttl and any of ddns-ttl-percent, ddns-ttl-min, or
+        // ddns-ttl-max. They are mutually exclusive.
+        // "ddns-ttl": 500,
+
+        // When greater than 0 it used as the lower boundary for calculated DNS TTL values.
+        // Specified in seconds.
+        "ddns-ttl-min": 24000,
+
+        // When greater than 0 it used as the upper boundary for calculated DNS TTL values.
+        // Specified in seconds.
+        "ddns-ttl-max": 64000,
+
         // Time in seconds specifying how long a declined lease should be
         // excluded from DHCP assignments. The default value is 86400 (24 hours).
         "decline-probation-period": 86400,
                 // requested.
                 "always-send": false,
 
+                // An optional list of classes for which this option applies.
+                // If the the client matches any of the classes in this list the
+                // option will be applied. If the list is empty or is
+                // omitted this option will be applied regardless of class
+                // membership.
+                "client-classes": [ "class1", "class2" ],
+
                 // Option code. It is not required if the option name is
                 // provided.
                 "code": 6,
                 "boot-file-name": "/dev/null",
 
                 // Restricts this shared network to allow only clients
-                // that belong to a particular client class. If an
-                // empty string is provided, no restriction is applied.
-                "client-class": "",
+                // that belong to at least one class in this list. If omitted
+                // or an empty list is provided, no restriction is applied.
+                "client-classes": [],
 
                 // Shared-network level value. See description at the global level.
                 "ddns-generated-prefix": "myhost",
                 // Shared-network level value. See description at the global level.
                 "ddns-ttl-percent": 0.65,
 
+                // Shared-network level value. See description at the global level.
+                // You cannot specify both ddns-ttl and any of ddns-ttl-percent, ddns-ttl-min, or
+                // ddns-ttl-max. They are mutually exclusive.
+                // "ddns-ttl": 500,
+
+                // Shared-network level value. See description at the global level.
+                "ddns-ttl-min": 10000,
+
+                // Shared-network level value. See description at the global level.
+                "ddns-ttl-max": 20000,
+
                 // Shared-network level value. See description at the global level.
                 "hostname-char-replacement": "x",
 
 
                 // List of client classes which must be evaluated when this shared
                 // network is selected for client assignments.
-                "require-client-classes": [ "late" ],
+                "evaluate-additional-classes": [ "late" ],
 
                 // Turn off storage of extended information (e.g. relay agent
                 // information) with each lease for this shared network.
                         // Subnet-level bootfile name, set in 'file' field.
                         "boot-file-name": "",
 
-                        // Restricts this subnet to allow only clients that belong
-                        // to a particular client class. If an empty string is
-                        // provided, no restriction is applied.
-                        "client-class": "",
+                        // Restricts this subnet to allow only clients
+                        // that belong to at least one class in this list. If omitted
+                        // or an empty list is provided, no restriction is applied.
+                        "client-classes": [],
 
                         // Subnet-level value. See description at the global level.
                         "ddns-generated-prefix": "myhost",
                         "ddns-conflict-resolution-mode": "check-with-dhcid",
 
                         // Subnet-level value. See description at the global level.
-                        "ddns-ttl-percent": 0.55,
+                        // "ddns-ttl-percent": 0.55,
+
+                        // Subnet-level value. See description at the global level.
+                        // You cannot specify both ddns-ttl and any of ddns-ttl-percent, ddns-ttl-min, or
+                        // ddns-ttl-max. They are mutually exclusive.
+                        "ddns-ttl": 500,
+
+                        // Subnet-evel value. See description at the global level.
+                        // "ddns-ttl-min": 10000,
+
+                        // Subnet-level value. See description at the global level.
+                        // "ddns-ttl-max": 20000,
 
                         // Subnet-level value. See description at the global level.
                         "hostname-char-replacement": "x",
                                 // should be always sent or sent only when requested.
                                 "always-send": false,
 
+                                // An optional list of classes for which this option applies.
+                                // If the the client matches any of the classes in this list the
+                                // option will be applied. If the list is empty or is
+                                // omitted this option will be applied regardless of class
+                                // membership.
+                                "client-classes": [],
+
                                 // Option code.
                                 "code": 3,
 
                         // List of IP address pools belonging to the subnet.
                         "pools": [
                             {
-                                // Restricts this pool to only be used for client
-                                // requests belonging to a particular client class.
-                                "client-class": "phones_server1",
+                                // Restricts this pool to allow only clients
+                                // that belong to at least one class in this list. If omitted
+                                // or an empty list is provided, no restriction is applied.
+                                "client-classes": [ "phones_server1" ],
 
                                 // Pool-level list of DHCP options.
                                 "option-data": [],
 
                                 // List of client classes which must be evaluated when this pool
                                 // is selected for client assignments.
-                                "require-client-classes": [ "late" ]
+                                "evaluate-additional-classes": [ "late" ],
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-generated-prefix": "mypool",
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-override-client-update": false,
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-override-no-update": false,
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-qualifying-suffix": "pool.example.com.",
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-replace-client-name": "always",
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-send-updates": true,
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-update-on-renew": false,
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-conflict-resolution-mode": "check-with-dhcid",
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-ttl-percent": 0.55,
+
+                                // Pool-level value. See description at the global level.
+                                // You cannot specify both ddns-ttl and any of ddns-ttl-percent,
+                                // ddns-ttl-min, or ddns-ttl-max. They are mutually exclusive.
+                                // "ddns-ttl": 500,
+
+                                // Pool-evel value. See description at the global level.
+                                "ddns-ttl-min": 10000,
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-ttl-max": 20000,
+
+                                // Pool-level value. See description at the global level.
+                                "hostname-char-replacement": "x",
+
+                                // Pool-level value. See description at the global level.
+                                "hostname-char-set": "[^A-Za-z0-9.-]"
                             },
                             {
-                                // Restricts this pool to only be used for client
-                                // requests belonging to a particular client class.
-                                "client-class": "phones_server2",
+                                // Restricts this pool to allow only clients
+                                // that belong to at least one class in this list. If omitted
+                                // or an empty list is provided, no restriction is applied.
+                                "client-classes": [ "phones_server2" ],
 
                                 // Pool-level list of DHCP options.
                                 "option-data": [],
 
                                 // List of client classes which must be evaluated when this pool
                                 // is selected for client assignments.
-                                "require-client-classes": [],
+                                "evaluate-additional-classes": [],
 
                                 // Pool identifier used to enable statistics for this pool.
                                 // The pool ID does not need to be unique within the subnet
 
                         // List of client classes which must be evaluated when this subnet
                         // is selected for client assignments.
-                        "require-client-classes": [ "late" ],
+                        "evaluate-additional-classes": [ "late" ],
 
                         // Subnet-level server hostname set in 'sname' field.
                         "server-hostname": "",
index f78ba78680827e9dd57126e914bfc746da1aee2e..9fc96ff57090c9e0af1a2aced417dc1218778167 100644 (file)
@@ -6,7 +6,7 @@
 // list of parameters supported by the Kea DHCPv6 server along with the brief
 // description of each parameter.
 //
-// This stable version is used for YANG as we do not want to update code
+// This stable version is used for YANG, as we do not want to update code
 // and models each time a keyword is added to the syntax.
 {
     // Kea DHCPv6 server configuration begins here.
 
                 // Boolean flag indicating whether the class expression is only evaluated
                 // when the class is required, e.g. the selected address pool configuration
-                // includes this class name in its "require-client-classes" list. The
+                // includes this class name in its "evaluate-additional-classes" list. The
                 // default value false means that the class test expression must
                 // always be evaluated.
-                "only-if-required": true,
+                "only-in-additional-list": true,
 
                 // Class selection expression.
                 "test": "member('ALL')"
 
         // Command control socket configuration parameters for the Kea DHCPv6 server.
         "control-socket": {
-            // Location of the UNIX domain socket file the DHCPv6 server uses
+            // Location of the UNIX domain socket file the DHCPv4 server uses
             // to receive control commands from the Kea Control Agent or the
             // local server administrator.
             "socket-name": "kea6-ctrl-socket",
 
-            // Control socket type used by the Kea DHCPv6 server. The 'unix'
+            // Control socket type used by the Kea DHCPv4 server. The 'unix'
             // socket is currently the only supported type.
             "socket-type": "unix"
         },
         // to use for the DNS TTL.
         "ddns-ttl-percent": 0.75,
 
+        // When greater than 0 it will be used as the DNS TTL. Specified in seconds.
+        // Cannot specify both ddns-ttl and any of ddns-ttl-percent, ddns-ttl-min or
+        // ddns-ttl-max. They are mutually exclusive.
+        // "ddns-ttl": 500,
+
+        // When greater than 0 it used as the lower boundary for calculated DNS TTL values.
+        // Specified in seconds.
+        "ddns-ttl-min": 24000,
+
+        // When greater than 0 it used as the upper boundary for calculated DNS TTL values.
+        // Specified in seconds.
+        "ddns-ttl-max": 64000,
+
         // Time in seconds specifying how long a declined lease should be
         // excluded from DHCP assignments. The default value is 24 hours.
         "decline-probation-period": 86400,
                 // requested.
                 "always-send": false,
 
+                // An optional list of classes for which this option applies.
+                // If the the client matches any of the classes in this list the
+                // option will be applied. If the list is empty or is
+                // omitted this option will be applied regardless of class
+                // membership.
+                "client-classes": [ "class1", "class2" ],
+
                 // Option code. It is not required if the option name is
                 // provided.
                 "code": 23,
                 "pd-allocator": "iterative",
 
                 // Restricts this shared network to allow only clients
-                // that belong to a particular client class. If an
-                // empty string is provided, no restriction is applied.
-                "client-class": "",
+                // that belong to at least one class in this list. If omitted
+                // or an empty list is provided, no restriction is applied.
+                "client-classes": [],
 
                 // Shared-network level value. See description at the global level.
                 "ddns-generated-prefix": "myhost",
                 // Shared-network level value. See description at the global level.
                 "ddns-ttl-percent": 0.65,
 
+                // Shared-network level value. See description at the global level.
+                // Cannot specify both ddns-ttl and any of ddns-ttl-percent, ddns-ttl-min or
+                // ddns-ttl-max. They are mutually exclusive.
+                // "ddns-ttl": 500,
+
+                // Shared-network level value. See description at the global level.
+                "ddns-ttl-min": 10000,
+
+                // Shared-network level value. See description at the global level.
+                "ddns-ttl-max": 20000,
+
                 // Shared-network level value. See description at the global level.
                 "hostname-char-replacement": "x",
 
 
                 // List of client classes which must be evaluated when this shared
                 // network is selected for client assignments.
-                "require-client-classes": [ "late" ],
+                "evaluate-additional-classes": [ "late" ],
 
                 // Turn off storage of extended information (e.g. relay agent
                 // information) with each lease for this shared network.
                         // for the subnet.
                         "pd-allocator": "iterative",
 
-                        // Restricts this subnet to allow only clients that belong
-                        // to a particular client class. If an empty string is
-                        // provided, no restriction is applied.
-                        "client-class": "",
+                        // Restricts this subnet to allow only clients
+                        // that belong to at least one class in this list. If omitted
+                        // or an empty list is provided, no restriction is applied.
+                        "client-classes": [],
 
                         // Subnet-level value. See description at the global level.
                         "ddns-generated-prefix": "myhost",
                         "ddns-conflict-resolution-mode": "check-with-dhcid",
 
                         // Subnet-level value. See description at the global level.
-                        "ddns-ttl-percent": 0.55,
+                        // "ddns-ttl-percent": 0.55,
+
+                        // "ddns-ttl": 0,
+                        // Cannot specify both ddns-ttl and any of ddns-ttl-percent, ddns-ttl-min or
+                        // ddns-ttl-max. They are mutually exclusive.
+                        "ddns-ttl": 500,
+
+                        // Subnet-evel value. See description at the global level.
+                        // "ddns-ttl-min": 10000,
+
+                        // Subnet-level value. See description at the global level.
+                        // "ddns-ttl-max": 20000,
 
                         // Subnet-level value. See description at the global level.
                         "hostname-char-replacement": "x",
                                 // should be always sent or sent only when requested.
                                 "always-send": false,
 
+                                // An optional list of classes for which this option applies.
+                                // If the the client matches any of the classes in this list the
+                                // option will be applied. If the list is empty or is
+                                // omitted this option will be applied regardless of class
+                                // membership.
+                                "client-classes": [],
+
                                 // Option code.
                                 "code": 7,
 
                         // clients.
                         "pd-pools": [
                             {
-                                // Restricts this prefix pool to be used only for the client
-                                // requests belonging to a particular client class.
-                                "client-class": "phones_server1",
+                                // Restricts this prefix pool subnet to allow only clients
+                                // that belong to at least one class in this list. If omitted
+                                // or an empty list is provided, no restriction is applied.
+                                "client-classes": [ "phones_server1" ],
 
                                 // Length of prefixes delegated to clients.
                                 "delegated-len": 64,
 
                                 // List of client classes which must be evaluated
                                 // when this prefix pool is selected for client assignments.
-                                "require-client-classes": [],
+                                "evaluate-additional-classes": [],
 
                                 // PD-pool identifier used to enable statistics for this pd-pool.
                                 // The pd-pool ID does not need to be unique within the subnet
                         // List of IP address pools belonging to the subnet.
                         "pools": [
                             {
-                                // Restricts this pool to only be used for client
-                                // requests belonging to a particular client class.
-                                "client-class": "phones_server1",
+                                // Restricts this pool subnet to allow only clients
+                                // that belong to at least one class in this list. If omitted
+                                // or an empty list is provided, no restriction is applied.
+                                "client-classes": [ "phones_server1" ],
 
                                 // Pool-level list of DHCP options.
                                 "option-data": [],
 
                                 // List of client classes which must be evaluated when this pool
                                 // is selected for client assignments.
-                                "require-client-classes": [ "late" ]
+                                "evaluate-additional-classes": [ "late" ],
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-generated-prefix": "mypool",
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-override-client-update": false,
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-override-no-update": false,
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-qualifying-suffix": "pool.example.com.",
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-replace-client-name": "always",
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-send-updates": true,
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-update-on-renew": false,
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-conflict-resolution-mode": "check-with-dhcid",
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-ttl-percent": 0.55,
+
+                                // Pool-level value. See description at the global level.
+                                // You cannot specify both ddns-ttl and any of ddns-ttl-percent,
+                                // ddns-ttl-min, or ddns-ttl-max. They are mutually exclusive.
+                                // "ddns-ttl": 500,
+
+                                // Pool-evel value. See description at the global level.
+                                "ddns-ttl-min": 10000,
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-ttl-max": 20000,
+
+                                // Pool-level value. See description at the global level.
+                                "hostname-char-replacement": "x",
+
+                                // Pool-level value. See description at the global level.
+                                "hostname-char-set": "[^A-Za-z0-9.-]"
                             },
                             {
-                                // Restricts this pool to only be used for client
-                                // requests belonging to a particular client class.
-                                "client-class": "phones_server2",
+                                // Restricts this pool subnet to allow only clients
+                                // that belong to at least one class in this list. If omitted
+                                // or an empty list is provided, no restriction is applied.
+                                "client-classes": [ "phones_server2" ],
 
                                 // Pool-level list of DHCP options.
                                 "option-data": [],
 
                                 // List of client classes which must be evaluated when this pool
                                 // is selected for client assignments.
-                                "require-client-classes": [],
+                                "evaluate-additional-classes": [],
 
                                 // Pool identifier used to enable statistics for this pool.
                                 // The pool ID does not need to be unique within the subnet
                                 // List of reserved IPv6 prefixes.
                                 "prefixes": [ "2001:db8:2:abcd::/64" ],
 
+                                // List of excluded IPv6 prefixes.
+                                "excluded-prefixes": [ "2001:db8:2:abcd:1::/80" ],
+
                                 // Reserved hostname.
                                 "hostname": "foo.example.com",
 
 
                         // List of client classes which must be evaluated when this subnet
                         // is selected for client assignments.
-                        "require-client-classes": [ "late" ],
+                        "evaluate-additional-classes": [ "late" ],
 
                         // Subnet prefix.
                         "subnet": "2001:db8::/32",
index 41c2a2d9f3417200cd6489d9a7308e0c2a891967..a1cb5c0372beddac4a016ead5a24f280f339cb21 100644 (file)
@@ -59,7 +59,7 @@
         "id": 1,
         "pools": [ { "pool": "2001:db8:1::/80" } ],
         "subnet": "2001:db8:1::/64",
-        "client-class": "cable-modems",
+        "client-classes": [ "cable-modems" ],
         "interface": "eth0"
     },
 
@@ -85,7 +85,7 @@
         "pools": [
            {
                "pool": "2001:db8:4::/80",
-               "client-class": "cable-modems"
+               "client-classes": [ "cable-modems" ]
            } ],
          "subnet": "2001:db8:4::/64",
          "interface": "eth1"
index 704a80c41038c67ca3aca196324db2d4301489cb..e13a57dc3e154e7af44ce3f55ea08c1c069855b2 100644 (file)
@@ -71,7 +71,7 @@
         "id": 1,
         "pools": [ { "pool": "2001:db8:1::/80" } ],
         "subnet": "2001:db8:1::/64",
-        "client-class": "cable-modems",
+        "client-classes": [ "cable-modems" ],
         "interface": "eth0"
     },
 // The following subnet contains a class reservation for a client using
@@ -96,7 +96,7 @@
         "pools": [
            {
                "pool": "2001:db8:4::/80",
-               "client-class": "cable-modems"
+               "client-classes": [ "cable-modems" ]
            } ],
          "subnet": "2001:db8:4::/64",
          "interface": "eth1"
         "pools": [
             {
                "pool": "2001:db8:8::/64",
-               "client-class": "UNKNOWN"
+               "client-classes": [ "UNKNOWN" ]
             },
             {
                "pool": "2001:db8:9::/64",
-               "client-class": "KNOWN"
+               "client-classes": [ "KNOWN" ]
            }
         ],
         "subnet": "2001:db8:8::/46",
index 74d44ec3a10f44ee27b2b67132029ba1c319f640..b4e19805d034cd314aaa1f60d4c4742266606d0e 100644 (file)
@@ -828,6 +828,12 @@ TEST(ParserTest, mapEntries) {
         }
         return (s + " }");
     };
+    // Remove deprecated parameters. This needs to be done because even though
+    // they are supported, examples are loaded by yang tests also and they don't
+    // support both old and new syntax.
+    ASSERT_EQ(syntax_keys.erase("client-class"), 1);
+    ASSERT_EQ(syntax_keys.erase("only-if-required"), 1);
+    ASSERT_EQ(syntax_keys.erase("require-client-classes"), 1);
     EXPECT_EQ(syntax_keys, sample_keys)
         << "syntax has: " << print_keys(syntax_keys) << endl
         << "sample has: " << print_keys(sample_keys) << endl;
index a19ecfaa3f6110acbf4bc797a7817f475408bdea..a82ca5c149f00f0529678e817f62870d2e83be62 100644 (file)
@@ -820,6 +820,12 @@ TEST(ParserTest, mapEntries) {
         }
         return (s + " }");
     };
+    // Remove deprecated parameters. This needs to be done because even though
+    // they are supported, examples are loaded by yang tests also and they don't
+    // support both old and new syntax.
+    ASSERT_EQ(syntax_keys.erase("client-class"), 1);
+    ASSERT_EQ(syntax_keys.erase("only-if-required"), 1);
+    ASSERT_EQ(syntax_keys.erase("require-client-classes"), 1);
     EXPECT_EQ(syntax_keys, sample_keys)
         << "syntax has: " << print_keys(syntax_keys) << endl
         << "sample has: " << print_keys(sample_keys) << endl;
index a97bf09edba0655be8a0be02e64301f2428f1c92..7b0a13304c04d53a7d67fedfeaf2661ddf4a81b9 100644 (file)
@@ -187,6 +187,10 @@ AdaptorConfig::sanitizeOptionDataList(ConstElementPtr options,
         ElementPtr option = options->getNonConst(i);
         setSpace(option, space);
         setCode(option, codes);
+        ConstElementPtr classes = option->get("client-classes");
+        if (classes && classes->empty()) {
+            option->remove("client-classes");
+        }
     }
 }
 
@@ -370,7 +374,7 @@ AdaptorConfig::sanitizeOptionSharedNetworks(ConstElementPtr networks,
 }
 
 void
-AdaptorConfig::sanitizeRequireClassesPools(ConstElementPtr pools) {
+AdaptorConfig::sanitizeEmptyListPools(ConstElementPtr pools) {
     if (!pools || pools->empty()) {
         // nothing to do here.
         return;
@@ -378,15 +382,19 @@ AdaptorConfig::sanitizeRequireClassesPools(ConstElementPtr pools) {
 
     for (size_t i = 0; i < pools->size(); ++i) {
         ElementPtr pool = pools->getNonConst(i);
-        ConstElementPtr require = pool->get("require-client-classes");
+        ConstElementPtr require = pool->get("evaluate-additional-classes");
         if (require && require->empty()) {
-            pool->remove("require-client-classes");
+            pool->remove("evaluate-additional-classes");
+        }
+        ConstElementPtr classes = pool->get("client-classes");
+        if (classes && classes->empty()) {
+            pool->remove("client-classes");
         }
     }
 }
 
 void
-AdaptorConfig::sanitizeRequireClassesSubnets(ConstElementPtr subnets) {
+AdaptorConfig::sanitizeEmptyListSubnets(ConstElementPtr subnets) {
     if (!subnets || subnets->empty()) {
         // nothing to do here.
         return;
@@ -394,18 +402,22 @@ AdaptorConfig::sanitizeRequireClassesSubnets(ConstElementPtr subnets) {
 
     for (size_t i = 0; i < subnets->size(); ++i) {
         ElementPtr subnet = subnets->getNonConst(i);
-        sanitizeRequireClassesPools(subnet->get("pools"));
-        sanitizeRequireClassesPools(subnet->get("pd-pools"));
-        ConstElementPtr require = subnet->get("require-client-classes");
+        sanitizeEmptyListPools(subnet->get("pools"));
+        sanitizeEmptyListPools(subnet->get("pd-pools"));
+        ConstElementPtr require = subnet->get("evaluate-additional-classes");
         if (require && require->empty()) {
-            subnet->remove("require-client-classes");
+            subnet->remove("evaluate-additional-classes");
+        }
+        ConstElementPtr classes = subnet->get("client-classes");
+        if (classes && classes->empty()) {
+            subnet->remove("client-classes");
         }
     }
 }
 
 void
-AdaptorConfig::requireClassesSharedNetworks(ConstElementPtr networks,
-                                            const string& subsel) {
+AdaptorConfig::sanitizeEmptyListSharedNetworks(ConstElementPtr networks,
+                                               const string& subsel) {
     if (!networks || networks->empty()) {
         // nothing to do here.
         return;
@@ -413,10 +425,14 @@ AdaptorConfig::requireClassesSharedNetworks(ConstElementPtr networks,
 
     for (size_t i = 0; i < networks->size(); ++i) {
         ElementPtr network = networks->getNonConst(i);
-        sanitizeRequireClassesSubnets(network->get(subsel));
-        ConstElementPtr require = network->get("require-client-classes");
+        sanitizeEmptyListSubnets(network->get(subsel));
+        ConstElementPtr require = network->get("evaluate-additional-classes");
         if (require && require->empty()) {
-            network->remove("require-client-classes");
+            network->remove("evaluate-additional-classes");
+        }
+        ConstElementPtr classes = network->get("client-classes");
+        if (classes && classes->empty()) {
+            network->remove("client-classes");
         }
     }
 }
@@ -599,8 +615,8 @@ AdaptorConfig::preProcess(ElementPtr dhcp, const string& subsel,
     sanitizeRelaySubnets(subnets);
     sanitizeRelayInSharedNetworks(networks, subsel);
 
-    sanitizeRequireClassesSubnets(subnets);
-    requireClassesSharedNetworks(networks, subsel);
+    sanitizeEmptyListSubnets(subnets);
+    sanitizeEmptyListSharedNetworks(networks, subsel);
 
     sanitizeDatabase(dhcp);
 
index 4848250ce78adc8c058195236c22f5e4f28ee690..5dc6935bef404847ebc9544a840a1924290052b2 100644 (file)
@@ -191,28 +191,37 @@ protected:
                                              const std::string& space,
                                              const OptionCodes& codes);
 
-    /// @brief Process require client classes in a pool list.
+    /// @brief Process empty lists in a pool list.
     ///
-    /// Remove empty require client class list.
+    /// Remove empty lists in a pool list.
+    /// removing:
+    ///  - evaluate-additional-classes
+    ///  - client-classes
     ///
     /// @param pools The pool list.
-    static void sanitizeRequireClassesPools(isc::data::ConstElementPtr pools);
+    static void sanitizeEmptyListPools(isc::data::ConstElementPtr pools);
 
-    /// @brief Process require client classes in a subnet list.
+    /// @brief Process empty lists in a subnet list.
     ///
-    /// Remove empty require client class lists.
+    /// Remove empty lists in a subnet list.
+    /// removing:
+    ///  - evaluate-additional-classes
+    ///  - client-classes
     ///
     /// @param subnets The subnet list.
-    static void sanitizeRequireClassesSubnets(isc::data::ConstElementPtr subnets);
+    static void sanitizeEmptyListSubnets(isc::data::ConstElementPtr subnets);
 
-    /// @brief Process require client classes in a shared network list.
+    /// @brief Process empty lists in a shared-network list.
     ///
-    /// Remove empty require client class lists.
+    /// Remove empty lists in a shared network list.
+    /// removing:
+    ///  - evaluate-additional-classes
+    ///  - client-classes
     ///
     /// @param networks The shared network list.
     /// @param subsel The subnet list name.
-    static void requireClassesSharedNetworks(isc::data::ConstElementPtr networks,
-                                             const std::string& subsel);
+    static void sanitizeEmptyListSharedNetworks(isc::data::ConstElementPtr networks,
+                                                const std::string& subsel);
 
     /// @brief Process host reservation list.
     ///
index 587a586ec272aeb4ab70085509f6364919c85901..b517ed4f77873ef1bf17fc588367b7bc734c6652 100644 (file)
@@ -80,7 +80,7 @@ public:
         tc.setConfig(json);
     }
 
-    /// @brief Load a cofiguration from a string containing JSON.
+    /// @brief Load a configuration from a string containing JSON.
     ///
     /// @param config The JSON tree to load in textual format.
     void load(const string& config) {
@@ -278,14 +278,14 @@ TEST_F(ConfigTestKeaV4, examples4) {
         "all-keys-netconf.json",
         "all-options.json",
         "backends.json",
-        //"classify.json",
-        //"classify2.json",
+        "classify.json",
+        "classify2.json",
         //"comments.json",
         "config-backend.json",
         "dhcpv4-over-dhcpv6.json",
         "global-reservations.json",
-        //"ha-load-balancing-server1-mt-with-tls.json",
-        //"ha-load-balancing-server2-mt.json",
+        "ha-load-balancing-server1-mt-with-tls.json",
+        "ha-load-balancing-server2-mt.json",
         "hooks.json",
         //"hooks-radius.json",
         "leases-expiration.json",
@@ -298,7 +298,7 @@ TEST_F(ConfigTestKeaV4, examples4) {
         "single-subnet.json",
         "vendor-specific.json",
         "vivso.json",
-        //"with-ddns.json",
+        "with-ddns.json",
     };
     for (auto const& file : examples) {
         resetSession();
@@ -319,7 +319,7 @@ TEST_F(ConfigTestKeaV6, examples6) {
         "all-options.json",
         "backends.json",
         "classify.json",
-        //"classify2.json",
+        "classify2.json",
         //"comments.json",
         "config-backend.json",
         "dhcpv4-over-dhcpv6.json",
@@ -340,7 +340,7 @@ TEST_F(ConfigTestKeaV6, examples6) {
         "softwire46.json",
         "stateless.json",
         "tee-times.json",
-        //"with-ddns.json",
+        "with-ddns.json",
     };
     for (auto const& file : examples) {
         resetSession();
index 02405c53132480dd863ccb939e844d0487417706..6259757029e8d2b2cc7bc673859e9b3a42f5c92e 100644 (file)
@@ -107,7 +107,7 @@ TEST_F(TranslatorClassesTestv6, set) {
     ElementPtr cclass = Element::createMap();
     cclass->set("name", Element::create("foo"));
     cclass->set("test", Element::create("''==''"));
-    cclass->set("only-if-required", Element::create(false));
+    cclass->set("only-in-additional-list", Element::create(false));
     classes->add(cclass);
     EXPECT_NO_THROW_LOG(translator_->setClasses(xpath, classes));
 
index 5553ced355cf662f07bccc2c059d28a9a7e2285e..6023dda585d4d237ffa9ee33097a459a2a5a7fcf 100644 (file)
@@ -60,7 +60,7 @@ TranslatorClass::getClassKea(DataNode const& data_node) {
 
     checkAndGetLeaf(result, data_node, "max-valid-lifetime");
     checkAndGetLeaf(result, data_node, "min-valid-lifetime");
-    checkAndGetLeaf(result, data_node, "only-if-required");
+    checkAndGetLeaf(result, data_node, "only-in-additional-list");
     checkAndGetLeaf(result, data_node, "template-test");
     checkAndGetLeaf(result, data_node, "test");
     checkAndGetLeaf(result, data_node, "valid-lifetime");
@@ -115,7 +115,7 @@ TranslatorClass::setClassKea(string const& xpath, ConstElementPtr elem) {
 
     checkAndSetLeaf(elem, xpath, "max-valid-lifetime", LeafBaseType::Uint32);
     checkAndSetLeaf(elem, xpath, "min-valid-lifetime", LeafBaseType::Uint32);
-    checkAndSetLeaf(elem, xpath, "only-if-required", LeafBaseType::Bool);
+    checkAndSetLeaf(elem, xpath, "only-in-additional-list", LeafBaseType::Bool);
     checkAndSetLeaf(elem, xpath, "template-test", LeafBaseType::String);
     checkAndSetLeaf(elem, xpath, "test", LeafBaseType::String);
     checkAndSetLeaf(elem, xpath, "valid-lifetime", LeafBaseType::Uint32);
index 5b2b7f6cc4e0f45cf2edfa81cebf8ac292f79b43..49dfd8c693a19026c8e9a91ca497121338d9d25a 100644 (file)
@@ -20,7 +20,7 @@ namespace yang {
 /// {
 ///     "name": <name>,
 ///     "test": <test expression>,
-///     "only-if-required": <only if required flag>,
+///     "only-in-additional-list": <only in additional list flag>,
 ///     "option-data": <option data list>,
 ///     (DHCPv4 only)
 ///     "option-def": <option definition list>,
@@ -35,18 +35,18 @@ namespace yang {
 /// YANG syntax for kea-dhcp[46] is with the name as the list key:
 /// @code
 /// +--rw client-class* [name]
-///    +--rw name                  string
-///    +--rw test?                 string
-///    +--rw only-if-required?     boolean
+///    +--rw name                       string
+///    +--rw test?                      string
+///    +--rw only-in-additional-list?   boolean
 ///    +--rw option-def* [code space]
 ///    +--rw option-data* [code space]
-///    +--rw next-server?          inet:ipv4-address
-///    +--rw server-hostname?      string
-///    +--rw boot-file-name?       string
-///    +--rw valid-lifetime?       uint32
-///    +--rw min-valid-lifetime?   uint32
-///    +--rw max-valid-lifetime?   uint32
-///    +--rw user-context?         user-context
+///    +--rw next-server?               inet:ipv4-address
+///    +--rw server-hostname?           string
+///    +--rw boot-file-name?            string
+///    +--rw valid-lifetime?            uint32
+///    +--rw min-valid-lifetime?        uint32
+///    +--rw max-valid-lifetime?        uint32
+///    +--rw user-context?              user-context
 /// @endcode
 ///
 /// An example in JSON and YANG formats:
@@ -55,7 +55,7 @@ namespace yang {
 ///     {
 ///         "name": "foo",
 ///         "test": "''==''",
-///         "only-if-required": false
+///         "only-in-additional-list": false
 ///     }
 /// ]
 /// @endcode
@@ -64,7 +64,7 @@ namespace yang {
 ///  /kea-dhcp6-server:config/client-class[name='foo'] (list instance)
 ///  /kea-dhcp6-server:config/client-class[name='foo']/name = foo
 ///  /kea-dhcp6-server:config/client-class[name='foo']/test = ''==''
-///  /kea-dhcp6-server:config/client-class[name='foo']/only-if-required = false
+///  /kea-dhcp6-server:config/client-class[name='foo']/only-in-additional-list = false
 /// @endcode
 
 /// @brief A translator class for converting a client class between
index 0c97ed67d5f60e405eba98657e8ac74428746813..85098559c208d2a3c9b695e712604cf4e4c49f5e 100644 (file)
@@ -192,6 +192,9 @@ TranslatorConfig::getServerKeaDhcpCommon(DataNode const& data_node) {
     checkAndGetLeaf(result, data_node, "ddns-replace-client-name");
     checkAndGetLeaf(result, data_node, "ddns-send-updates");
     checkAndGetLeaf(result, data_node, "ddns-ttl-percent");
+    checkAndGetLeaf(result, data_node, "ddns-ttl");
+    checkAndGetLeaf(result, data_node, "ddns-ttl-min");
+    checkAndGetLeaf(result, data_node, "ddns-ttl-max");
     checkAndGetLeaf(result, data_node, "ddns-update-on-renew");
     checkAndGetLeaf(result, data_node, "ddns-use-conflict-resolution");
     checkAndGetLeaf(result, data_node, "ddns-conflict-resolution-mode");
@@ -511,6 +514,9 @@ TranslatorConfig::setServerKeaDhcpCommon(string const& xpath,
     checkAndSetLeaf(elem, xpath, "ddns-replace-client-name", LeafBaseType::String);
     checkAndSetLeaf(elem, xpath, "ddns-send-updates", LeafBaseType::Bool);
     checkAndSetLeaf(elem, xpath, "ddns-ttl-percent", LeafBaseType::Dec64);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl", LeafBaseType::Uint32);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl-min", LeafBaseType::Uint32);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl-max", LeafBaseType::Uint32);
     checkAndSetLeaf(elem, xpath, "ddns-update-on-renew", LeafBaseType::Bool);
     checkAndSetLeaf(elem, xpath, "ddns-use-conflict-resolution", LeafBaseType::Bool);
     checkAndSetLeaf(elem, xpath, "ddns-conflict-resolution-mode", LeafBaseType::Enum);
index 9510dccb717b77265e11415ee369ceaf5f75c390..f51adbb9d6051b6fea62fa3b40e7db18d04b9271 100644 (file)
@@ -78,6 +78,7 @@ TranslatorHost::getHostKea(DataNode const& data_node) {
     } else {
         checkAndGetLeaf(result, data_node, "ip-addresses");
         checkAndGetLeaf(result, data_node, "prefixes");
+        checkAndGetLeaf(result, data_node, "excluded-prefixes");
     }
 
     return (result->empty() ? ElementPtr() : result);
@@ -125,6 +126,7 @@ TranslatorHost::setHostKea(string const& xpath, ConstElementPtr elem) {
     } else {
         checkAndSetLeafList(elem, xpath, "ip-addresses", LeafBaseType::String);
         checkAndSetLeafList(elem, xpath, "prefixes", LeafBaseType::String);
+        checkAndSetLeafList(elem, xpath, "excluded-prefixes", LeafBaseType::String);
     }
 
     // User context is supported in both kea-dhcp4-server and kea-dhcp6-server.
index 6527492732067d5dbfa949f7d108fd95835ed4cb..99762660320388b55b20881eebe6ec4dc14b8994 100644 (file)
@@ -67,6 +67,7 @@ TranslatorOptionData::getOptionDataKea(DataNode const& data_node) {
     checkAndGetLeaf(result, data_node, "csv-format");
     checkAndGetLeaf(result, data_node, "name");
     checkAndGetLeaf(result, data_node, "never-send");
+    checkAndGetLeaf(result, data_node, "client-classes");
 
     checkAndGetAndJsonifyLeaf(result, data_node, "user-context");
 
@@ -105,6 +106,7 @@ TranslatorOptionData::setOptionDataKea(string const& xpath,
     checkAndSetLeaf(elem, xpath, "csv-format", LeafBaseType::Bool);
     checkAndSetLeaf(elem, xpath, "name", LeafBaseType::String);
     checkAndSetLeaf(elem, xpath, "never-send", LeafBaseType::Bool);
+    checkAndSetLeafList(elem, xpath, "client-classes", LeafBaseType::String);
 
     checkAndSetUserContext(elem, xpath);
 }
index bd02978561f346e42083f8b3e70c95ef0be34059..97a1d2a94ce22d17c6ea6298aa8acaf6cec934bd 100644 (file)
@@ -78,13 +78,13 @@ TranslatorPdPool::getPdPoolIetf6(DataNode const& data_node) {
     getMandatoryDivergingLeaf(result, data_node, "prefix-len", "prefix-length");
 
     checkAndGetLeaf(result, data_node, "preferred-lifetime");
-    checkAndGetLeaf(result, data_node, "client-class");
+    checkAndGetLeaf(result, data_node, "client-classes");
     checkAndGetLeaf(result, data_node, "valid-lifetime");
 
     checkAndGetDivergingLeaf(result, data_node, "rebind-timer", "rebind-time");
     checkAndGetDivergingLeaf(result, data_node, "renew-timer", "renew-time");
 
-    // no require-client-classes nor user-context.
+    // no evaluate-additional-classes nor user-context.
     // Skip max-pd-space-utilization.
     // Skip rapid-commit.
     // @todo: option-data
@@ -147,9 +147,24 @@ TranslatorPdPool::getPdPoolKea(DataNode const& data_node) {
         }
     }
 
-    checkAndGetLeaf(result, data_node, "client-class");
+    checkAndGetLeaf(result, data_node, "ddns-generated-prefix");
+    checkAndGetLeaf(result, data_node, "ddns-override-client-update");
+    checkAndGetLeaf(result, data_node, "ddns-override-no-update");
+    checkAndGetLeaf(result, data_node, "ddns-qualifying-suffix");
+    checkAndGetLeaf(result, data_node, "ddns-replace-client-name");
+    checkAndGetLeaf(result, data_node, "ddns-send-updates");
+    checkAndGetLeaf(result, data_node, "ddns-ttl-percent");
+    checkAndGetLeaf(result, data_node, "ddns-ttl");
+    checkAndGetLeaf(result, data_node, "ddns-ttl-min");
+    checkAndGetLeaf(result, data_node, "ddns-ttl-max");
+    checkAndGetLeaf(result, data_node, "ddns-update-on-renew");
+    checkAndGetLeaf(result, data_node, "ddns-use-conflict-resolution");
+    checkAndGetLeaf(result, data_node, "ddns-conflict-resolution-mode");
+    checkAndGetLeaf(result, data_node, "hostname-char-replacement");
+    checkAndGetLeaf(result, data_node, "hostname-char-set");
+    checkAndGetLeaf(result, data_node, "client-classes");
     checkAndGetLeaf(result, data_node, "delegated-len");
-    checkAndGetLeaf(result, data_node, "require-client-classes");
+    checkAndGetLeaf(result, data_node, "evaluate-additional-classes");
 
     checkAndGetLeaf(result, data_node, "pool-id");
 
@@ -195,7 +210,7 @@ TranslatorPdPool::setPdPoolIetf6(string const& xpath, ConstElementPtr elem) {
     setItem(xpath + "/prefix", Element::create(prefix.str()), LeafBaseType::String);
     setItem(xpath + "/prefix-length", length, LeafBaseType::Uint8);
 
-    checkAndSetLeaf(elem, xpath, "client-class", LeafBaseType::String);
+    checkAndSetLeafList(elem, xpath, "client-classes", LeafBaseType::String);
     checkAndSetLeaf(elem, xpath, "preferred-lifetime", LeafBaseType::Uint32);
     checkAndSetLeaf(elem, xpath, "valid-lifetime", LeafBaseType::Uint32);
 
@@ -215,10 +230,25 @@ TranslatorPdPool::setPdPoolKea(string const& xpath, ConstElementPtr elem) {
     // Keys are set by setting the list itself.
     setItem(xpath, ElementPtr(), LeafBaseType::Unknown);
 
-    checkAndSetLeaf(elem, xpath, "client-class", LeafBaseType::String);
     checkAndSetLeaf(elem, xpath, "delegated-len", LeafBaseType::Uint8);
 
-    checkAndSetLeafList(elem, xpath, "require-client-classes", LeafBaseType::String);
+    checkAndSetLeaf(elem, xpath, "ddns-generated-prefix", LeafBaseType::String);
+    checkAndSetLeaf(elem, xpath, "ddns-override-client-update", LeafBaseType::Bool);
+    checkAndSetLeaf(elem, xpath, "ddns-override-no-update", LeafBaseType::Bool);
+    checkAndSetLeaf(elem, xpath, "ddns-qualifying-suffix", LeafBaseType::String);
+    checkAndSetLeaf(elem, xpath, "ddns-replace-client-name", LeafBaseType::String);
+    checkAndSetLeaf(elem, xpath, "ddns-send-updates", LeafBaseType::Bool);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl-percent", LeafBaseType::Dec64);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl", LeafBaseType::Uint32);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl-min", LeafBaseType::Uint32);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl-max", LeafBaseType::Uint32);
+    checkAndSetLeaf(elem, xpath, "ddns-update-on-renew", LeafBaseType::Bool);
+    checkAndSetLeaf(elem, xpath, "ddns-use-conflict-resolution", LeafBaseType::Bool);
+    checkAndSetLeaf(elem, xpath, "ddns-conflict-resolution-mode", LeafBaseType::Enum);
+    checkAndSetLeaf(elem, xpath, "hostname-char-replacement", LeafBaseType::String);
+    checkAndSetLeaf(elem, xpath, "hostname-char-set", LeafBaseType::String);
+    checkAndSetLeafList(elem, xpath, "client-classes", LeafBaseType::String);
+    checkAndSetLeafList(elem, xpath, "evaluate-additional-classes", LeafBaseType::String);
 
     checkAndSetLeaf(elem, xpath, "pool-id", LeafBaseType::Dec64);
 
index a7d0ec030b94e3b8a0ea497fbf9940d2b4da21be..33f8df3a36547c69c38eb527d556dcdd3b0cfc35 100644 (file)
@@ -23,8 +23,8 @@ namespace yang {
 ///     "excluded-prefix": <excluded prefix>,
 ///     "excluded-prefix-len": <excluded prefix length>,
 ///     "option-data": [ <list of option data> ],
-///     "client-class": "<guard class name>",
-///     "require-client-classes": [ <list of required class names> ],
+///     "client-classes": [ <list of guard class names> ],
+///     "evaluate-additional-classes": [ <list of evaluate additional class names> ],
 ///     "user-context": { <json map> },
 ///     "comment": "<comment>"
 /// }
@@ -40,7 +40,7 @@ namespace yang {
 ///  +--rw rebind-time                 yang:timeticks
 ///  +--rw preferred-lifetime          yang:timeticks
 ///  +--rw rapid-commit?               boolean
-///  +--rw client-class?               string
+///  +--rw client-classes*             string
 ///  +--rw max-pd-space-utilization?   threshold
 ///  +--rw option-set-id?
 ///     /server/server-config/option-sets/option-set/option-set-id
@@ -49,13 +49,13 @@ namespace yang {
 /// YANG syntax for kea-dhcp6-server is with prefix as the key.
 /// @code
 /// +--rw pd-pool* [prefix]
-///    +--rw prefix                    inet:ipv6-prefix
-///    +--rw delegated-len?            uint8
+///    +--rw prefix                         inet:ipv6-prefix
+///    +--rw delegated-len?                 uint8
 ///    +--rw option-data* [code space]
-///    +--rw client-class?             string
-///    +--rw require-client-classes*   string
-///    +--rw excluded-prefix?          inet:ipv6-prefix
-///    +--rw user-context?             user-context
+///    +--rw client-classes*                string
+///    +--rw evaluate-additional-classes*   string
+///    +--rw excluded-prefix?               inet:ipv6-prefix
+///    +--rw user-context?                  user-context
 /// @endcode
 ///
 /// An example in JSON and YANG formats:
index eb0ea5e9cfe56cd649562fe1a08f4823d901de81..6145c5b02a5efe54c9bddf55eaedce8bcd73b4ee 100644 (file)
@@ -75,7 +75,7 @@ TranslatorPool::getPoolIetf6(DataNode const& data_node) {
     // Skip rapid-commit.
     // Skip start-address - end-address as prefix form is mandatory?
     // @todo: option-data
-    // No require-client-classes.
+    // No evaluate-additional-classes.
     // No user-context.
 
     return (result->empty() ? ElementPtr() : result);
@@ -103,9 +103,24 @@ TranslatorPool::getPoolKea(DataNode const& data_node) {
     if (options) {
         result->set("option-data", options);
     }
-
-    checkAndGetLeaf(result, data_node, "client-class");
-    checkAndGetLeaf(result, data_node, "require-client-classes");
+    checkAndGetLeaf(result, data_node, "ddns-generated-prefix");
+    checkAndGetLeaf(result, data_node, "ddns-override-client-update");
+    checkAndGetLeaf(result, data_node, "ddns-override-no-update");
+    checkAndGetLeaf(result, data_node, "ddns-qualifying-suffix");
+    checkAndGetLeaf(result, data_node, "ddns-replace-client-name");
+    checkAndGetLeaf(result, data_node, "ddns-send-updates");
+    checkAndGetLeaf(result, data_node, "ddns-ttl-percent");
+    checkAndGetLeaf(result, data_node, "ddns-ttl");
+    checkAndGetLeaf(result, data_node, "ddns-ttl-min");
+    checkAndGetLeaf(result, data_node, "ddns-ttl-max");
+    checkAndGetLeaf(result, data_node, "ddns-update-on-renew");
+    checkAndGetLeaf(result, data_node, "ddns-use-conflict-resolution");
+    checkAndGetLeaf(result, data_node, "ddns-conflict-resolution-mode");
+    checkAndGetLeaf(result, data_node, "hostname-char-replacement");
+    checkAndGetLeaf(result, data_node, "hostname-char-set");
+
+    checkAndGetLeaf(result, data_node, "client-classes");
+    checkAndGetLeaf(result, data_node, "evaluate-additional-classes");
 
     checkAndGetLeaf(result, data_node, "pool-id");
 
@@ -190,9 +205,23 @@ TranslatorPool::setPoolKea(string const& xpath, ConstElementPtr elem) {
     // Keys are set by setting the list itself.
     setItem(xpath, ElementPtr(), LeafBaseType::Unknown);
 
-    checkAndSetLeaf(elem, xpath, "client-class", LeafBaseType::String);
-
-    checkAndSetLeafList(elem, xpath, "require-client-classes", LeafBaseType::String);
+    checkAndSetLeaf(elem, xpath, "ddns-generated-prefix", LeafBaseType::String);
+    checkAndSetLeaf(elem, xpath, "ddns-override-client-update", LeafBaseType::Bool);
+    checkAndSetLeaf(elem, xpath, "ddns-override-no-update", LeafBaseType::Bool);
+    checkAndSetLeaf(elem, xpath, "ddns-qualifying-suffix", LeafBaseType::String);
+    checkAndSetLeaf(elem, xpath, "ddns-replace-client-name", LeafBaseType::String);
+    checkAndSetLeaf(elem, xpath, "ddns-send-updates", LeafBaseType::Bool);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl-percent", LeafBaseType::Dec64);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl", LeafBaseType::Uint32);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl-min", LeafBaseType::Uint32);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl-max", LeafBaseType::Uint32);
+    checkAndSetLeaf(elem, xpath, "ddns-update-on-renew", LeafBaseType::Bool);
+    checkAndSetLeaf(elem, xpath, "ddns-use-conflict-resolution", LeafBaseType::Bool);
+    checkAndSetLeaf(elem, xpath, "ddns-conflict-resolution-mode", LeafBaseType::Enum);
+    checkAndSetLeaf(elem, xpath, "hostname-char-replacement", LeafBaseType::String);
+    checkAndSetLeaf(elem, xpath, "hostname-char-set", LeafBaseType::String);
+    checkAndSetLeafList(elem, xpath, "client-classes", LeafBaseType::String);
+    checkAndSetLeafList(elem, xpath, "evaluate-additional-classes", LeafBaseType::String);
 
     checkAndSetLeaf(elem, xpath, "pool-id", LeafBaseType::Dec64);
 
index 90b9f352f3ebd890700f6450b5f720585d0802e4..de200c0d9e46c18e8ae802712f987ee19e0a3053 100644 (file)
@@ -21,8 +21,8 @@ namespace yang {
 /// {
 ///     "pool": "<pool prefix or start - end addresses>",
 ///     "option-data": [ <list of option data> ],
-///     "client-class": "<guard class name>",
-///     "require-client-classes": [ <list of required class names> ],
+///     "client-classes": [ <list of guard class names> ],
+///     "evaluate-additional-classes": [ <list of evaluate additional class names> ],
 ///     "user-context": { <json map> },
 ///     "comment": "<comment>"
 /// }
@@ -39,7 +39,7 @@ namespace yang {
 ///  +--rw rebind-time           yang:timeticks
 ///  +--rw preferred-lifetime    yang:timeticks
 ///  +--rw rapid-commit?         boolean
-///  +--rw client-class?         string
+///  +--rw client-classes*       string
 ///  +--rw max-address-count     threshold
 ///  +--rw option-set-id
 ///     /server/server-config/option-sets/option-set/option-set-id
@@ -49,13 +49,13 @@ namespace yang {
 /// as the keys:
 /// @code
 /// +--rw pool* [start-address end-address]
-///    +--rw prefix?                   inet:ipv[46]-prefix
-///    +--rw start-address             inet:ipv[46]-address
-///    +--rw end-address               inet:ipv[46]-address
+///    +--rw prefix?                        inet:ipv[46]-prefix
+///    +--rw start-address                  inet:ipv[46]-address
+///    +--rw end-address                    inet:ipv[46]-address
 ///    +--rw option-data* [code space]
-///    +--rw client-class?             string
-///    +--rw require-client-classes*   string
-///    +--rw user-context?             user-context
+///    +--rw client-classes*                string
+///    +--rw evaluate-additional-classes*   string
+///    +--rw user-context?                  user-context
 /// @endcode
 ///
 /// An example in JSON and YANG formats for the IETF model:
index e4dfa09a1ddb245c9aba5f723d6df3d959928113..c1bfd7874422bac04a00c9756856a63af720056f 100644 (file)
@@ -71,7 +71,7 @@ TranslatorSharedNetwork::getSharedNetworkKea(DataNode const& data_node,
     checkAndGetLeaf(result, data_node, "cache-max-age");
     checkAndGetLeaf(result, data_node, "cache-threshold");
     checkAndGetLeaf(result, data_node, "calculate-tee-times");
-    checkAndGetLeaf(result, data_node, "client-class");
+    checkAndGetLeaf(result, data_node, "client-classes");
     checkAndGetLeaf(result, data_node, "ddns-generated-prefix");
     checkAndGetLeaf(result, data_node, "ddns-override-client-update");
     checkAndGetLeaf(result, data_node, "ddns-override-no-update");
@@ -79,6 +79,9 @@ TranslatorSharedNetwork::getSharedNetworkKea(DataNode const& data_node,
     checkAndGetLeaf(result, data_node, "ddns-replace-client-name");
     checkAndGetLeaf(result, data_node, "ddns-send-updates");
     checkAndGetLeaf(result, data_node, "ddns-ttl-percent");
+    checkAndGetLeaf(result, data_node, "ddns-ttl");
+    checkAndGetLeaf(result, data_node, "ddns-ttl-min");
+    checkAndGetLeaf(result, data_node, "ddns-ttl-max");
     checkAndGetLeaf(result, data_node, "ddns-update-on-renew");
     checkAndGetLeaf(result, data_node, "ddns-use-conflict-resolution");
     checkAndGetLeaf(result, data_node, "ddns-conflict-resolution-mode");
@@ -89,7 +92,7 @@ TranslatorSharedNetwork::getSharedNetworkKea(DataNode const& data_node,
     checkAndGetLeaf(result, data_node, "min-valid-lifetime");
     checkAndGetLeaf(result, data_node, "rebind-timer");
     checkAndGetLeaf(result, data_node, "renew-timer");
-    checkAndGetLeaf(result, data_node, "require-client-classes");
+    checkAndGetLeaf(result, data_node, "evaluate-additional-classes");
     checkAndGetLeaf(result, data_node, "reservations-global");
     checkAndGetLeaf(result, data_node, "reservations-in-subnet");
     checkAndGetLeaf(result, data_node, "reservations-out-of-pool");
@@ -170,7 +173,6 @@ TranslatorSharedNetwork::setSharedNetworkKea(string const& xpath,
     checkAndSetLeaf(elem, xpath, "cache-max-age", LeafBaseType::Uint32);
     checkAndSetLeaf(elem, xpath, "cache-threshold", LeafBaseType::Dec64);
     checkAndSetLeaf(elem, xpath, "calculate-tee-times", LeafBaseType::Bool);
-    checkAndSetLeaf(elem, xpath, "client-class", LeafBaseType::String);
     checkAndSetLeaf(elem, xpath, "ddns-generated-prefix", LeafBaseType::String);
     checkAndSetLeaf(elem, xpath, "ddns-override-client-update", LeafBaseType::Bool);
     checkAndSetLeaf(elem, xpath, "ddns-override-no-update", LeafBaseType::Bool);
@@ -178,6 +180,9 @@ TranslatorSharedNetwork::setSharedNetworkKea(string const& xpath,
     checkAndSetLeaf(elem, xpath, "ddns-replace-client-name", LeafBaseType::String);
     checkAndSetLeaf(elem, xpath, "ddns-send-updates", LeafBaseType::Bool);
     checkAndSetLeaf(elem, xpath, "ddns-ttl-percent", LeafBaseType::Dec64);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl", LeafBaseType::Uint32);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl-min", LeafBaseType::Uint32);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl-max", LeafBaseType::Uint32);
     checkAndSetLeaf(elem, xpath, "ddns-update-on-renew", LeafBaseType::Bool);
     checkAndSetLeaf(elem, xpath, "ddns-use-conflict-resolution", LeafBaseType::Bool);
     checkAndSetLeaf(elem, xpath, "ddns-conflict-resolution-mode", LeafBaseType::Enum);
@@ -196,7 +201,8 @@ TranslatorSharedNetwork::setSharedNetworkKea(string const& xpath,
     checkAndSetLeaf(elem, xpath, "t2-percent", LeafBaseType::Dec64);
     checkAndSetLeaf(elem, xpath, "valid-lifetime", LeafBaseType::Uint32);
 
-    checkAndSetLeafList(elem, xpath, "require-client-classes", LeafBaseType::String);
+    checkAndSetLeafList(elem, xpath, "client-classes", LeafBaseType::String);
+    checkAndSetLeafList(elem, xpath, "evaluate-additional-classes", LeafBaseType::String);
 
     checkAndSetUserContext(elem, xpath);
 
index a40dfac2f2a32defa92aea59b52c1fde473e066d..96da42f02c73917bd580a0ba01cd5fb18271f8d3 100644 (file)
@@ -30,8 +30,8 @@ namespace yang {
 ///     "t2-percent": <T2 percent>,
 ///     "option-data": [ <list of option data> ],
 ///     "interface": "<interface>",
-///     "client-class": "<guard class name>",
-///     "require-client-classes": [ <list of required class names> ],
+///     "client-classes": [ <list of guard class names> ],
+///     "evaluate-additional-classes": [ <list of evaluate additional class names> ],
 ///     "relay": <relay ip address(es)>,
 ///     "match-client-id": <match client id flag>,
 ///     "next-server": "<next server>",
@@ -63,8 +63,8 @@ namespace yang {
 ///     "interface": "<interface>",
 ///     "interface-id": "<interface id>",
 ///     "rapid-commit": <rapid commit flag>,
-///     "client-class": "<guard class name>",
-///     "require-client-classes": [ <list of required class names> ],
+///     "client-classes": [ <list of guard class names> ],
+///     "evaluate-additional-classes": [ <list of evaluate additional class names> ],
 ///     "relay": <relay ip address(es)>,
 ///     "user-context": { <json map> },
 ///     "comment": "<comment>"
@@ -79,8 +79,8 @@ namespace yang {
 ///    +--rw renew-timer?                    uint32
 ///    +--rw rebind-timer?                   uint32
 ///    +--rw option-data* [code space]
-///    +--rw client-class?                   string
-///    +--rw require-client-classes*         string
+///    +--rw client-classes*                 string
+///    +--rw evaluate-additional-classes*    string
 ///    +--rw valid-lifetime?                 uint32
 ///    +--rw min-valid-lifetime?             uint32
 ///    +--rw max-valid-lifetime?             uint32
index 18eb6a9310641bcae214ee3bc6dabbd9735fa9ee..be9b69dfe2041ac2eb3e4cbca67604ccc6ad7c25 100644 (file)
@@ -104,7 +104,7 @@ TranslatorSubnet::getSubnetKea(DataNode const& data_node) {
     checkAndGetLeaf(result, data_node, "cache-max-age");
     checkAndGetLeaf(result, data_node, "cache-threshold");
     checkAndGetLeaf(result, data_node, "calculate-tee-times");
-    checkAndGetLeaf(result, data_node, "client-class");
+    checkAndGetLeaf(result, data_node, "client-classes");
     checkAndGetLeaf(result, data_node, "ddns-generated-prefix");
     checkAndGetLeaf(result, data_node, "ddns-override-client-update");
     checkAndGetLeaf(result, data_node, "ddns-override-no-update");
@@ -112,6 +112,9 @@ TranslatorSubnet::getSubnetKea(DataNode const& data_node) {
     checkAndGetLeaf(result, data_node, "ddns-replace-client-name");
     checkAndGetLeaf(result, data_node, "ddns-send-updates");
     checkAndGetLeaf(result, data_node, "ddns-ttl-percent");
+    checkAndGetLeaf(result, data_node, "ddns-ttl");
+    checkAndGetLeaf(result, data_node, "ddns-ttl-min");
+    checkAndGetLeaf(result, data_node, "ddns-ttl-max");
     checkAndGetLeaf(result, data_node, "ddns-update-on-renew");
     checkAndGetLeaf(result, data_node, "ddns-use-conflict-resolution");
     checkAndGetLeaf(result, data_node, "ddns-conflict-resolution-mode");
@@ -122,7 +125,7 @@ TranslatorSubnet::getSubnetKea(DataNode const& data_node) {
     checkAndGetLeaf(result, data_node, "min-valid-lifetime");
     checkAndGetLeaf(result, data_node, "rebind-timer");
     checkAndGetLeaf(result, data_node, "renew-timer");
-    checkAndGetLeaf(result, data_node, "require-client-classes");
+    checkAndGetLeaf(result, data_node, "evaluate-additional-classes");
     checkAndGetLeaf(result, data_node, "reservations-global");
     checkAndGetLeaf(result, data_node, "reservations-in-subnet");
     checkAndGetLeaf(result, data_node, "reservations-out-of-pool");
@@ -256,7 +259,6 @@ TranslatorSubnet::setSubnetKea(string const& xpath, ConstElementPtr elem) {
     checkAndSetLeaf(elem, xpath, "cache-max-age", LeafBaseType::Uint32);
     checkAndSetLeaf(elem, xpath, "cache-threshold", LeafBaseType::Dec64);
     checkAndSetLeaf(elem, xpath, "calculate-tee-times", LeafBaseType::Bool);
-    checkAndSetLeaf(elem, xpath, "client-class", LeafBaseType::String);
     checkAndSetLeaf(elem, xpath, "ddns-generated-prefix", LeafBaseType::String);
     checkAndSetLeaf(elem, xpath, "ddns-override-client-update", LeafBaseType::Bool);
     checkAndSetLeaf(elem, xpath, "ddns-override-no-update", LeafBaseType::Bool);
@@ -264,6 +266,9 @@ TranslatorSubnet::setSubnetKea(string const& xpath, ConstElementPtr elem) {
     checkAndSetLeaf(elem, xpath, "ddns-replace-client-name", LeafBaseType::String);
     checkAndSetLeaf(elem, xpath, "ddns-send-updates", LeafBaseType::Bool);
     checkAndSetLeaf(elem, xpath, "ddns-ttl-percent", LeafBaseType::Dec64);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl", LeafBaseType::Uint32);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl-min", LeafBaseType::Uint32);
+    checkAndSetLeaf(elem, xpath, "ddns-ttl-max", LeafBaseType::Uint32);
     checkAndSetLeaf(elem, xpath, "ddns-update-on-renew", LeafBaseType::Bool);
     checkAndSetLeaf(elem, xpath, "ddns-use-conflict-resolution", LeafBaseType::Bool);
     checkAndSetLeaf(elem, xpath, "ddns-conflict-resolution-mode", LeafBaseType::Enum);
@@ -282,7 +287,8 @@ TranslatorSubnet::setSubnetKea(string const& xpath, ConstElementPtr elem) {
     checkAndSetLeaf(elem, xpath, "t2-percent", LeafBaseType::Dec64);
     checkAndSetLeaf(elem, xpath, "valid-lifetime", LeafBaseType::Uint32);
 
-    checkAndSetLeafList(elem, xpath, "require-client-classes", LeafBaseType::String);
+    checkAndSetLeafList(elem, xpath, "client-classes", LeafBaseType::String);
+    checkAndSetLeafList(elem, xpath, "evaluate-additional-classes", LeafBaseType::String);
 
     ConstElementPtr options = elem->get("option-data");
     if (options && !options->empty()) {
index 52191bbd40213c48fd85502dfbbd856f9da02b62..cadbccd1399d708f452dcb0c5bb58559118cd325 100644 (file)
@@ -33,8 +33,8 @@ namespace yang {
 ///     "subnet": "<subnet prefix>",
 ///     "interface": "<interface>",
 ///     "id": <id>,
-///     "client-class": "<guard class name>",
-///     "require-client-classes": [ <list of required class names> ],
+///     "client-classes": [ <list of guard class names> ],
+///     "evaluate-additional-classes": [ <list of evaluate additional class names> ],
 ///     "reservations": [ <list of host reservations> ],
 ///     "relay": <relay ip address(es)>,
 ///     "match-client-id": <match client id flag>,
@@ -72,8 +72,8 @@ namespace yang {
 ///     "interface-id": "<interface id>",
 ///     "id": <id>,
 ///     "rapid-commit": <rapid commit flag>,
-///     "client-class": "<guard class name>",
-///     "require-client-classes": [ <list of required class names> ],
+///     "client-classes": [ <list of guard class names> ],
+///     "evaluate-additional-classes": [ <list of evaluate additional class names> ],
 ///     "reservations": [ <list of host reservations> ],
 ///     "relay": <relay ip address(es)>,
 ///     "user-context": { <json map> },
@@ -109,8 +109,8 @@ namespace yang {
 ///     +--rw subnet                          inet:ipv4-prefix
 ///     +--rw interface?                      string
 ///     +--rw id                              uint32
-///     +--rw client-class?                   string
-///     +--rw require-client-classes*         string
+///     +--rw client-classes*                 string
+///     +--rw evaluate-additional-classes*    string
 ///     +--rw host* [identifier-type identifier]
 ///     +--rw relay
 ///     +--rw cache-max-age?                  uint32
index 1c422e7f60210d4e60f05cbe8ace65344e992f0b..35ac2acfa2ac06ab781c46deaa0ef237bf5b3e11 100644 (file)
@@ -22,9 +22,9 @@ static const std::unordered_map<std::string, std::string> YANG_REVISIONS = {
     { "ietf-dhcpv6-options", "2018-09-04" },
     { "ietf-dhcpv6-server", "2018-09-04" },
     { "kea-types", "2019-08-12" },
-    { "kea-dhcp-types", "2024-05-29" },
-    { "kea-dhcp4-server", "2024-05-29" },
-    { "kea-dhcp6-server", "2024-05-29" },
+    { "kea-dhcp-types", "2025-06-25" },
+    { "kea-dhcp4-server", "2025-06-25" },
+    { "kea-dhcp6-server", "2025-06-25" },
     { "kea-ctrl-agent", "2019-08-12" },
     { "kea-dhcp-ddns", "2022-07-27" }
 };  // YANG_REVISIONS
diff --git a/src/share/yang/modules/hashes/kea-dhcp-types@2024-05-29.hash b/src/share/yang/modules/hashes/kea-dhcp-types@2024-05-29.hash
deleted file mode 100644 (file)
index 99b1725..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ed30e29cccb5c67db520704003a88e9a574e46f3579d3a20e651deefcbec33c7
diff --git a/src/share/yang/modules/hashes/kea-dhcp-types@2025-06-25.hash b/src/share/yang/modules/hashes/kea-dhcp-types@2025-06-25.hash
new file mode 100644 (file)
index 0000000..4410e2e
--- /dev/null
@@ -0,0 +1 @@
+59fe3a0d6ee9a5a71e861908c559f5d34098f7443bc38601c439102a088b636c
diff --git a/src/share/yang/modules/hashes/kea-dhcp4-server@2024-05-29.hash b/src/share/yang/modules/hashes/kea-dhcp4-server@2024-05-29.hash
deleted file mode 100644 (file)
index 01d0d1f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-57ef5ec1a319aa17b5440f60963ae208b69e7a12943c3bb8fff830df02bdfe23
diff --git a/src/share/yang/modules/hashes/kea-dhcp4-server@2025-06-25.hash b/src/share/yang/modules/hashes/kea-dhcp4-server@2025-06-25.hash
new file mode 100644 (file)
index 0000000..9e93f81
--- /dev/null
@@ -0,0 +1 @@
+cf4f3382b9ba301f50593a1ccc277c8635225090e17af2dea75d09ad9c5d197b
diff --git a/src/share/yang/modules/hashes/kea-dhcp6-server@2024-05-29.hash b/src/share/yang/modules/hashes/kea-dhcp6-server@2024-05-29.hash
deleted file mode 100644 (file)
index 89edd24..0000000
+++ /dev/null
@@ -1 +0,0 @@
-aabb48a3bb003438297b8ce1600cfe068adc71accccaa6d711d32ed781afaaf9
diff --git a/src/share/yang/modules/hashes/kea-dhcp6-server@2025-06-25.hash b/src/share/yang/modules/hashes/kea-dhcp6-server@2025-06-25.hash
new file mode 100644 (file)
index 0000000..a0545cb
--- /dev/null
@@ -0,0 +1 @@
+f7dd8cb1cd744d0533e7f3207d131b6305b083f2a7fe2aefd77b9e4598c2dbf8
similarity index 90%
rename from src/share/yang/modules/kea-dhcp-types@2024-05-29.yang
rename to src/share/yang/modules/kea-dhcp-types@2025-06-25.yang
index 24a4a7e0749bfc807adba25e971813e1edec4bd8..c5d3468b5b4ecc3b246ec8a9b6714c3e6fb9fe2d 100644 (file)
@@ -16,6 +16,13 @@ module kea-dhcp-types {
   description "This file defines some commonly used Kea DHCP types and
                groupings.";
 
+  revision 2025-06-25 {
+    description "Renamed only-if-required to only-in-additional-list, renamed
+                 require-client-classes to evaluate-additional-classes, removed
+                 client-class and added client-classes list, and added ddns-ttl,
+                 ddns-ttl-min, ddns-ttl-max.";
+  }
+
   revision 2024-05-29 {
     description "Removed qualifying-suffix, override-no-update,
                  override-client-update, replace-client-name, generated-prefix,
@@ -530,76 +537,86 @@ module kea-dhcp-types {
     }
   }
 
-  grouping client-class {
-    description "Client class grouping.";
-    leaf client-class {
+  grouping client-classes {
+    description "Client classes grouping.";
+    leaf-list client-classes {
       type string;
-      description "Client class entry.";
+      description "List of client classes.";
+    }
+  }
+
+  grouping option-data-client-classes {
+    description "Client classes grouping for option data.";
+    uses client-classes {
+      refine client-classes {
+        description "Option data client classes guard (this option will be
+                     assigned only to clients belonging to one of these classes).";
+      }
     }
   }
 
-  grouping pool-client-class {
-    description "Client class grouping for a pool.";
-    uses client-class {
-      refine client-class {
-        description "Pool client class guard (only clients belonging
-                     to this class will be allowed in this pool).";
+  grouping pool-client-classes {
+    description "Client classes grouping for a pool.";
+    uses client-classes {
+      refine client-classes {
+        description "Pool client classes guard (only clients belonging
+                     to one of these classes will be allowed in this pool).";
       }
     }
   }
 
-  grouping subnet-client-class {
-    description "Client class grouping for a subnet.";
-    uses client-class {
-      refine client-class {
-        description "Subnet client class guard (only clients belonging to this
-                     class will be allowed in this subnet).";
+  grouping subnet-client-classes {
+    description "Client classes grouping for a subnet.";
+    uses client-classes {
+      refine client-classes {
+        description "Subnet client classes guard (only clients belonging to one
+                     of these classes will be allowed in this subnet).";
       }
     }
   }
 
-  grouping network-client-class {
-    description "Client class grouping for a shared network.";
-    uses client-class {
-      refine client-class {
+  grouping network-client-classes {
+    description "Client classes grouping for a shared network.";
+    uses client-classes {
+      refine client-classes {
         description "Shared network client class guard (only clients
-                     belonging to this class will be allowed in this
+                     belonging to one of these classes will be allowed in this
                      shared network).";
       }
     }
   }
 
-  grouping require-client-classes {
-    description "Require client classes grouping.";
-    leaf-list require-client-classes {
+  grouping evaluate-additional-classes {
+    description "Evaluate additional client classes grouping.";
+    leaf-list evaluate-additional-classes {
       type string;
       description "List of client classes.";
     }
   }
 
-  grouping pool-require-client-classes {
-    description "Require client classes grouping for a pool.";
-    uses require-client-classes {
-      refine require-client-classes {
-        description "Pool require client classes.";
+  grouping pool-evaluate-additional-classes {
+    description "Evaluate additional client classes grouping for a pool.";
+    uses evaluate-additional-classes {
+      refine evaluate-additional-classes {
+        description "Pool evaluate additional client classes.";
       }
     }
   }
 
-  grouping subnet-require-client-classes {
-    description "Require client classes grouping for a subnet.";
-    uses require-client-classes {
-      refine require-client-classes {
-        description "Subnet require client classes.";
+  grouping subnet-evaluate-additional-classes {
+    description "Evaluate additional client classes grouping for a subnet.";
+    uses evaluate-additional-classes {
+      refine evaluate-additional-classes {
+        description "Subnet evaluate additional client classes.";
       }
     }
   }
 
-  grouping network-require-client-classes {
-    description "Require client classes grouping for a shared network.";
-    uses require-client-classes {
-      refine require-client-classes {
-        description "Shared network require client classes.";
+  grouping network-evaluate-additional-classes {
+    description "Evaluate additional client classes grouping for a shared network.";
+    uses evaluate-additional-classes {
+      refine evaluate-additional-classes {
+        description "Shared network evaluate additional client classes.";
       }
     }
   }
@@ -675,7 +692,7 @@ module kea-dhcp-types {
     leaf-list client-classes {
       type string;
       description "Host client classes (if host identifier matches, a
-                   client's packet will be added to the classes liste
+                   client's packet will be added to the classes listed
                    here.)";
     }
   }
@@ -754,11 +771,11 @@ module kea-dhcp-types {
     }
   }
 
-  grouping class-only-if-required {
-    description "Client class only-if-required grouping.";
-    leaf only-if-required {
+  grouping class-only-in-additional-list {
+    description "Client class only-in-additional-list grouping.";
+    leaf only-in-additional-list {
       type boolean;
-      description "Client class only if required flag.";
+      description "Client class only in additional list flag.";
     }
   }
 
@@ -1086,6 +1103,30 @@ module kea-dhcp-types {
     }
   }
 
+  grouping ddns-ttl {
+    leaf ddns-ttl {
+      type uint32;
+      description
+        "the DDNS TTL.";
+    }
+  }
+
+  grouping ddns-ttl-min {
+    leaf ddns-ttl-min {
+      type uint32;
+      description
+        "the minimum DDNS TTL.";
+    }
+  }
+
+  grouping ddns-ttl-max {
+    leaf ddns-ttl-max {
+      type uint32;
+      description
+        "the maximum DDNS TTL.";
+    }
+  }
+
   grouping ddns-update-on-renew {
     leaf ddns-update-on-renew {
       type boolean;
similarity index 90%
rename from src/share/yang/modules/kea-dhcp4-server@2024-05-29.yang
rename to src/share/yang/modules/kea-dhcp4-server@2025-06-25.yang
index c1a5ba93cbaa2c10a16d04edaa857b1bfe4a9393..5b6b36e25964ad4161d36ed2a0a734933cfc00d7 100644 (file)
@@ -12,7 +12,7 @@ module kea-dhcp4-server {
   }
   import kea-dhcp-types {
     prefix dhcp;
-    revision-date 2024-05-29;
+    revision-date 2025-06-25;
   }
 
   organization "Internet Systems Consortium";
@@ -20,6 +20,17 @@ module kea-dhcp4-server {
   description "This model defines a YANG data model that can be
                used to configure and manage a Kea DHCPv4 server.";
 
+  revision 2025-06-25 {
+    description "Renamed only-if-required to only-in-additional-list, renamed
+                 require-client-classes to evaluate-additional-classes, removed
+                 client-class and added client-classes list, added ddns-ttl,
+                 ddns-ttl-min, ddns-ttl-max, and added ddns-generated-prefix,
+                 ddns-override-client-update, ddns-override-no-update,
+                 ddns-qualifying-suffix, ddns-replace-client-name, ddns-send-updates,
+                 ddns-update-on-renew, ddns-conflict-resolution-mode,
+                 hostname-char-replacement and hostname-char-set at pool level.";
+  }
+
   revision 2024-05-29 {
     description "Removed reservation-mode and added
                  ddns-conflict-resolution-mode and stash-agent-options.";
@@ -230,8 +241,23 @@ module kea-dhcp4-server {
           description "Last IPv4 address in a pool.";
         }
         uses option-data-list;
-        uses dhcp:pool-client-class;
-        uses dhcp:pool-require-client-classes;
+        uses dhcp:ddns-generated-prefix;
+        uses dhcp:ddns-override-client-update;
+        uses dhcp:ddns-override-no-update;
+        uses dhcp:ddns-qualifying-suffix;
+        uses dhcp:ddns-replace-client-name;
+        uses dhcp:ddns-send-updates;
+        uses dhcp:ddns-ttl-percent;
+        uses dhcp:ddns-ttl;
+        uses dhcp:ddns-ttl-min;
+        uses dhcp:ddns-ttl-max;
+        uses dhcp:ddns-update-on-renew;
+        uses dhcp:ddns-use-conflict-resolution;
+        uses dhcp:ddns-conflict-resolution-mode;
+        uses dhcp:hostname-char-replacement;
+        uses dhcp:hostname-char-set;
+        uses dhcp:pool-client-classes;
+        uses dhcp:pool-evaluate-additional-classes;
         uses dhcp:pool-id;
         uses dhcp:pool-user-context;
       }
@@ -242,8 +268,8 @@ module kea-dhcp4-server {
       }
       uses dhcp:subnet-interface;
       uses dhcp:subnet-id;
-      uses dhcp:subnet-client-class;
-      uses dhcp:subnet-require-client-classes;
+      uses dhcp:subnet-client-classes;
+      uses dhcp:subnet-evaluate-additional-classes;
       uses reservations {
         refine host {
           description "Subnet host reservations list.";
@@ -279,6 +305,9 @@ module kea-dhcp4-server {
       uses dhcp:ddns-replace-client-name;
       uses dhcp:ddns-send-updates;
       uses dhcp:ddns-ttl-percent;
+      uses dhcp:ddns-ttl;
+      uses dhcp:ddns-ttl-min;
+      uses dhcp:ddns-ttl-max;
       uses dhcp:ddns-update-on-renew;
       uses dhcp:ddns-use-conflict-resolution;
       uses dhcp:ddns-conflict-resolution-mode;
@@ -301,7 +330,7 @@ module kea-dhcp4-server {
       uses dhcp:class-name;
       uses dhcp:class-test;
       uses dhcp:template-test;
-      uses dhcp:class-only-if-required;
+      uses dhcp:class-only-in-additional-list;
       uses dhcp:offer-lifetime;
       uses option-def-list;
       uses option-data-list;
@@ -357,6 +386,7 @@ module kea-dhcp4-server {
       uses dhcp:option-data-csv-format;
       uses dhcp:option-data-always-send;
       uses dhcp:option-data-never-send;
+      uses dhcp:option-data-client-classes;
       uses dhcp:option-data-user-context;
     }
   }
@@ -402,8 +432,8 @@ module kea-dhcp4-server {
         uses relay;
       }
       uses authoritative;
-      uses dhcp:network-client-class;
-      uses dhcp:network-require-client-classes;
+      uses dhcp:network-client-classes;
+      uses dhcp:network-evaluate-additional-classes;
       uses dhcp:valid-lifetime;
       uses dhcp:min-valid-lifetime;
       uses dhcp:max-valid-lifetime;
@@ -419,6 +449,9 @@ module kea-dhcp4-server {
       uses dhcp:ddns-replace-client-name;
       uses dhcp:ddns-send-updates;
       uses dhcp:ddns-ttl-percent;
+      uses dhcp:ddns-ttl;
+      uses dhcp:ddns-ttl-min;
+      uses dhcp:ddns-ttl-max;
       uses dhcp:ddns-update-on-renew;
       uses dhcp:ddns-use-conflict-resolution;
       uses dhcp:ddns-conflict-resolution-mode;
@@ -527,6 +560,9 @@ module kea-dhcp4-server {
     uses dhcp:ddns-replace-client-name;
     uses dhcp:ddns-send-updates;
     uses dhcp:ddns-ttl-percent;
+    uses dhcp:ddns-ttl;
+    uses dhcp:ddns-ttl-min;
+    uses dhcp:ddns-ttl-max;
     uses dhcp:ddns-update-on-renew;
     uses dhcp:ddns-use-conflict-resolution;
     uses dhcp:ddns-conflict-resolution-mode;
similarity index 87%
rename from src/share/yang/modules/kea-dhcp6-server@2024-05-29.yang
rename to src/share/yang/modules/kea-dhcp6-server@2025-06-25.yang
index cee124a9ed8366ec6d1d8c9543b39c975769b14a..162ac948e0c99f8d21265eae72a3862367239726 100644 (file)
@@ -12,7 +12,7 @@ module kea-dhcp6-server {
   }
   import kea-dhcp-types {
     prefix dhcp;
-    revision-date 2024-05-29;
+    revision-date 2025-06-25;
   }
 
   organization "Internet Systems Consortium";
@@ -20,6 +20,18 @@ module kea-dhcp6-server {
   description "This model defines a YANG data model that can be
                used to configure and manage a Kea DHCPv6 server.";
 
+  revision 2025-06-25 {
+    description "Renamed only-if-required to only-in-additional-list, renamed
+                 require-client-classes to evaluate-additional-classes, removed
+                 client-class and added client-classes list, added ddns-ttl,
+                 ddns-ttl-min, ddns-ttl-max, added ddns-generated-prefix,
+                 ddns-override-client-update, ddns-override-no-update,
+                 ddns-qualifying-suffix, ddns-replace-client-name, ddns-send-updates,
+                 ddns-update-on-renew, ddns-conflict-resolution-mode,
+                 hostname-char-replacement and hostname-char-set at pool and pd-pool
+                 level, and added excluded-prefixes at pd-pool level.";
+  }
+
   revision 2024-05-29 {
     description "Removed reservation-mode and added
                  ddns-conflict-resolution-mode.";
@@ -181,6 +193,10 @@ module kea-dhcp6-server {
       type inet:ipv6-prefix;
       description "Host reserved IP prefixes.";
     }
+    leaf-list excluded-prefixes {
+      type inet:ipv6-prefix;
+      description "Excluded IP prefixes.";
+    }
     uses dhcp:host-hostname;
     uses dhcp:host-client-classes;
     uses option-data-list;
@@ -235,8 +251,23 @@ module kea-dhcp6-server {
           description "Last IPv6 address in a pool.";
         }
         uses option-data-list;
-        uses dhcp:pool-client-class;
-        uses dhcp:pool-require-client-classes;
+        uses dhcp:ddns-generated-prefix;
+        uses dhcp:ddns-override-client-update;
+        uses dhcp:ddns-override-no-update;
+        uses dhcp:ddns-qualifying-suffix;
+        uses dhcp:ddns-replace-client-name;
+        uses dhcp:ddns-send-updates;
+        uses dhcp:ddns-ttl-percent;
+        uses dhcp:ddns-ttl;
+        uses dhcp:ddns-ttl-min;
+        uses dhcp:ddns-ttl-max;
+        uses dhcp:ddns-update-on-renew;
+        uses dhcp:ddns-use-conflict-resolution;
+        uses dhcp:ddns-conflict-resolution-mode;
+        uses dhcp:hostname-char-replacement;
+        uses dhcp:hostname-char-set;
+        uses dhcp:pool-client-classes;
+        uses dhcp:pool-evaluate-additional-classes;
         uses dhcp:pool-id;
         uses dhcp:pool-user-context;
       }
@@ -254,16 +285,31 @@ module kea-dhcp6-server {
           description "Prefix pool delegated length.";
         }
         uses option-data-list;
-        uses dhcp:client-class {
-          refine client-class {
-            description "Prefix pool client class guard. (only
-                         clients belonging to this class will be
+        uses dhcp:ddns-generated-prefix;
+        uses dhcp:ddns-override-client-update;
+        uses dhcp:ddns-override-no-update;
+        uses dhcp:ddns-qualifying-suffix;
+        uses dhcp:ddns-replace-client-name;
+        uses dhcp:ddns-send-updates;
+        uses dhcp:ddns-ttl-percent;
+        uses dhcp:ddns-ttl;
+        uses dhcp:ddns-ttl-min;
+        uses dhcp:ddns-ttl-max;
+        uses dhcp:ddns-update-on-renew;
+        uses dhcp:ddns-use-conflict-resolution;
+        uses dhcp:ddns-conflict-resolution-mode;
+        uses dhcp:hostname-char-replacement;
+        uses dhcp:hostname-char-set;
+        uses dhcp:client-classes {
+          refine client-classes {
+            description "Prefix pool client class guard. (only clients
+                         belonging to any of these class will be
                          allowed in this pool).";
           }
         }
-        uses dhcp:require-client-classes {
-          refine require-client-classes {
-            description "Prefix pool require client classes.";
+        uses dhcp:evaluate-additional-classes {
+          refine evaluate-additional-classes {
+            description "Prefix pool evaluate additional client classes.";
           }
         }
         leaf excluded-prefix {
@@ -295,8 +341,8 @@ module kea-dhcp6-server {
           description "Subnet rapid commit flag.";
         }
       }
-      uses dhcp:subnet-client-class;
-      uses dhcp:require-client-classes;
+      uses dhcp:subnet-client-classes;
+      uses dhcp:subnet-evaluate-additional-classes;
       uses reservations {
         refine host {
           description "Subnet host reservations list.";
@@ -315,6 +361,9 @@ module kea-dhcp6-server {
       uses dhcp:ddns-replace-client-name;
       uses dhcp:ddns-send-updates;
       uses dhcp:ddns-ttl-percent;
+      uses dhcp:ddns-ttl;
+      uses dhcp:ddns-ttl-min;
+      uses dhcp:ddns-ttl-max;
       uses dhcp:ddns-update-on-renew;
       uses dhcp:ddns-use-conflict-resolution;
       uses dhcp:ddns-conflict-resolution-mode;
@@ -337,7 +386,7 @@ module kea-dhcp6-server {
       uses dhcp:class-name;
       uses dhcp:class-test;
       uses dhcp:template-test;
-      uses dhcp:class-only-if-required;
+      uses dhcp:class-only-in-additional-list;
       uses option-data-list;
       uses preferred-lifetime;
       uses min-preferred-lifetime;
@@ -391,6 +440,7 @@ module kea-dhcp6-server {
       uses dhcp:option-data-csv-format;
       uses dhcp:option-data-always-send;
       uses dhcp:option-data-never-send;
+      uses dhcp:option-data-client-classes;
       uses dhcp:option-data-user-context;
     }
   }
@@ -440,8 +490,8 @@ module kea-dhcp6-server {
         description "Optional information about relay agent.";
         uses relay;
       }
-      uses dhcp:network-client-class;
-      uses dhcp:require-client-classes;
+      uses dhcp:network-client-classes;
+      uses dhcp:network-evaluate-additional-classes;
       uses preferred-lifetime;
       uses min-preferred-lifetime;
       uses max-preferred-lifetime;
@@ -465,6 +515,9 @@ module kea-dhcp6-server {
       uses dhcp:ddns-replace-client-name;
       uses dhcp:ddns-send-updates;
       uses dhcp:ddns-ttl-percent;
+      uses dhcp:ddns-ttl;
+      uses dhcp:ddns-ttl-min;
+      uses dhcp:ddns-ttl-max;
       uses dhcp:ddns-update-on-renew;
       uses dhcp:ddns-use-conflict-resolution;
       uses dhcp:ddns-conflict-resolution-mode;
@@ -590,6 +643,9 @@ module kea-dhcp6-server {
     uses dhcp:ddns-replace-client-name;
     uses dhcp:ddns-send-updates;
     uses dhcp:ddns-ttl-percent;
+    uses dhcp:ddns-ttl;
+    uses dhcp:ddns-ttl-min;
+    uses dhcp:ddns-ttl-max;
     uses dhcp:ddns-update-on-renew;
     uses dhcp:ddns-use-conflict-resolution;
     uses dhcp:ddns-conflict-resolution-mode;
index 043e71276ecf5378acfa2481b6250535c1423a6a..c81026da6ce057f8f98e780ec19326c49b7f188b 100644 (file)
@@ -16,9 +16,9 @@ yangmodules_list = [
     'ietf-yang-types@2013-07-15.yang',
     'kea-ctrl-agent@2019-08-12.yang',
     'kea-dhcp-ddns@2022-07-27.yang',
-    'kea-dhcp-types@2024-05-29.yang',
-    'kea-dhcp4-server@2024-05-29.yang',
-    'kea-dhcp6-server@2024-05-29.yang',
+    'kea-dhcp-types@2025-06-25.yang',
+    'kea-dhcp4-server@2025-06-25.yang',
+    'kea-dhcp6-server@2025-06-25.yang',
     'kea-types@2019-08-12.yang',
     'keatest-module@2022-11-30.yang',
 ]