+Kea 3.1.2 (development) released on September 24, 2025
+
+2403. [func] fdupont
+ Added "pkt4-service-disabled" and "pkt6-service-disabled"
+ statistics which are increased when an incoming packet
+ was dropped because the DHCP service is disabled.
+ (Gitlab #4096)
+
+2402. [func] fdupont
+ When Kea is configured to use the memfile lease backend,
+ the "status-get" command returns the location of the
+ CVS backup file in the "csv-lease-file" entry.
+ (Gitlab #2305)
+
+2401. [sec] tmark
+ Removed logging of database password as clear
+ text when kea-dhcp4 or kea-dhcp6 initializes
+ the schema.
+ (Gitlab #4086)
+
+2400. [bug] fdupont
+ Fixed a race condition in pid file handling (used by
+ servers, agents and lease file cleanup).
+ (Gitlab #4107)
+
+2399. [func] fdupont
+ Added support of RADIUS dictionary includes, vendor
+ attributes and integer translations to the RADIUS hook
+ library for compatibility with previous versions using
+ the FreeRADIUS client library.
+ (Gitlab #3860)
+
+2398. [sec] fdupont
+ Added the "basic-auth-user-file" parameter to the HA
+ hook library. This allows the basic HTTP auth user
+ ID to be read from a file rather than specified as
+ clear text in the configuration.
+ (Gitlab #4070)
+
+2397. [func] tmark
+ Additional packet details are now emitted in
+ debug level logs by kea-dhcp4 for both inbound
+ and outbound packets.
+ (Gitlab #3531)
+
+2396. [func] tmark
+ The flex-id hook library parameter, ``identifier-expression``,
+ is now optional. Prior to this, it was mandatory.
+ (Gitlab #4011)
+
2395. [build] razvan
The library version numbers have been bumped up for the Kea 3.1.2
development release.
file cleanup process is running.
(Gitlab #3986)
-Kea 3.1.1 (development) released on September 27, 2025
+Kea 3.1.1 (development) released on August 27, 2025
2391. [bug] fdupont
When reusing an expired lease, kea-dhcp6 now correctly saves
+++ /dev/null
-[func] fdupont
- When Kea is configured to use the memfile lease backend,
- the "status-get" command returns the location of the
- CVS backup file in the "csv-lease-file" entry.
- (Gitlab #2305)
+++ /dev/null
-[func] tmark
- Additional packet details are now emitted in
- debug level logs by kea-dhcp4 for both inbound
- and outbound packets.
- (Gitlab #3531)
+++ /dev/null
-[func] fdupont
- Added support of RADIUS dictionary includes, vendor
- attributes and integer translations to the RADIUS hook
- library for compatibility with previous versions using
- the FreeRADIUS client library.
- (Gitlab #2860)
+++ /dev/null
-[func] tmark
- The flex-id hook library parameter, ``identifier-expression``,
- is now optional. Prior to this, it was mandatory.
- (Gitlab #4011)
+++ /dev/null
-[sec] fdupont
- Added the "basic-auth-user-file" parameter to the HA
- hook library. This allows the basic HTTP auth user
- ID to be read from a file rather than specified as
- clear text in the configuration.
- (Gitlab #4070)
+++ /dev/null
-[sec] tmark
- Removed logging of database password as clear
- text when kea-dhcp4 or kea-dhcp6 initializes
- the schema.
- (Gitlab #4086)
+++ /dev/null
-[func] fdupont
- Added "pkt4-service-disabled" and "pkt6-service-disabled"
- statistics which are increased when an incoming packet
- was dropped because the DHCP service is disabled.
- (Gitlab #4096)
+++ /dev/null
-[bug] fdupont
- Fixed a race condition in pid file handling (used by
- servers, agents and lease file cleanup).
- (Gitlab #4107)
-// Copyright (C) 2018-2023 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2018-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
- FLEX_ID_IGNORE_IAID_APPLIED_ON_PD
- FLEX_ID_IGNORE_IAID_NOT_APPLIED_ON_NA
- FLEX_ID_IGNORE_IAID_NOT_APPLIED_ON_PD
+- FLEX_ID_NO_IDENTIFIER_EXPRESSION
- FLEX_ID_RESTORE_CLIENT_ID
- FLEX_ID_RESTORE_DUID
- FLEX_ID_USED_AS_CLIENT_ID
Logged at debug log level 55.
A debug message printing the details of the received packet. The first
argument includes the client and the transaction identification
-information.
+information. Packet fields ciaddr, yiaddr, siaddr, giaddr, sname, and file
+will be included when not empty.
DHCP4_QUERY_LABEL
=================
to the client. The first argument contains the client and the transaction
identification information. The second and third argument contains the
packet name and type respectively. The fourth argument contains detailed
-packet information.
+packet information. Packet fields ciaddr, yiaddr, siaddr, giaddr, sname,
+and file will be included when not empty.
DHCP4_RESPONSE_FQDN_DATA
========================
This is an informational message reporting that the configuration has
been extended to include the specified subnet.
+DHCPSRV_CFGMGR_OPTION_DEFINITION_MISMATCH
+=========================================
+
+.. code-block:: text
+
+ failed to create option: %1
+
+This warning message is issued when an option has been specified for which
+there is no suitable option definition. Either there is no definition at all
+or the option contents do not fit the option definition. The argument will
+provide a detailed reason for the failure. The server will continue to
+operate but it will exclude the option from packet processing until the
+situation is corrected. This is considered a configuration error.
+
DHCPSRV_CFGMGR_OPTION_DUPLICATE
===============================
lease file for lease file cleanup. The server continues to
operate but leases do not persist to disk.
+DHCPSRV_MEMFILE_LFC_RESCHEDULED
+===============================
+
+.. code-block:: text
+
+ rescheduled Lease File Cleanup
+
+An informational message issued when the memfile lease database backend
+rescheduled the periodic Lease File Cleanup at the reception of a
+"kea-lfc-start" command.
+
DHCPSRV_MEMFILE_LFC_SETUP
=========================
FLEX
****
-FLEX_ID_EXPRESSION_EMPTY
-========================
-
-.. code-block:: text
-
- Specified identifier-expression is empty
-
-This warning message is printed when the flex-id library is being loaded,
-but the expression used to generate the identifier is empty. The library
-will load, but will not generate any identifiers. Please make sure that
-the identifier-expression parameter is specified.
-
FLEX_ID_EXPRESSION_EVALUATED
============================
but the expression used to generate the identifier is malformed. It has
a different JSON type (e.g. is a map) rather than expected string.
-FLEX_ID_EXPRESSION_NOT_DEFINED
-==============================
-
-.. code-block:: text
-
- Expression (identifier-expression) is not defined.
-
-This warning message is printed when the flex-id library is loaded, but the
-expression used to generate the identifier is not specified. The library
-will load, but will not generate any identifiers. Please make sure that
-the identifier-expression parameter is specified for your library.
-
FLEX_ID_EXPRESSION_PARSE_FAILED
===============================
loading of the library. Details of the problem are printed as parameter
to this message.
+FLEX_ID_NO_IDENTIFIER_EXPRESSION
+================================
+
+.. code-block:: text
+
+ identifier-expression is either not specified or empty
+
+Logged at debug log level 40.
+This debug message is printed when the flex-id library is being loaded,
+but the expression used to generate the identifier was either omitted or
+is empty. The library will load, but will neither generate nor replace
+client identifiers. Typically this occurs when users are only interested
+in using ignore-iaid, which operates independently of the expression.
+
FLEX_ID_REPLACE_CLIENT_ID_JSON_TYPE
===================================
systems. Kea-|release| builds have been tested on:
* Alpine — 3.19, 3.20, 3.21, 3.22
-* Debian — 11, 12
+* Debian — 11, 12, 13
* Fedora — 41, 42
* FreeBSD — 14
* RHEL — 8, 9, 10
-#line 2 "agent_lexer.cc"
+#line 1 "agent_lexer.cc"
-#line 4 "agent_lexer.cc"
+#line 3 "agent_lexer.cc"
#define YY_INT_ALIGNED short int
/* To avoid the call to exit... oops! */
#define YY_FATAL_ERROR(msg) isc::agent::ParserContext::fatal(msg)
-#line 1628 "agent_lexer.cc"
+#line 1627 "agent_lexer.cc"
/* noyywrap disables automatic rewinding for the next file to parse. Since we
always parse only a single string, there's no need to do any wraps. And
using yywrap requires linking with -lfl, which provides the default yywrap
by moving it ahead by yyleng bytes. yyleng specifies the length of the
currently matched token. */
#define YY_USER_ACTION driver.loc_.columns(yyleng);
+#line 1653 "agent_lexer.cc"
#line 1654 "agent_lexer.cc"
-#line 1655 "agent_lexer.cc"
#define INITIAL 0
#define COMMENT 1
}
-#line 1969 "agent_lexer.cc"
+#line 1968 "agent_lexer.cc"
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
#line 835 "agent_lexer.ll"
ECHO;
YY_BREAK
-#line 2986 "agent_lexer.cc"
+#line 2985 "agent_lexer.cc"
case YY_END_OF_BUFFER:
{
-#line 2 "d2_lexer.cc"
+#line 1 "d2_lexer.cc"
-#line 4 "d2_lexer.cc"
+#line 3 "d2_lexer.cc"
#define YY_INT_ALIGNED short int
/* To avoid the call to exit... oops! */
#define YY_FATAL_ERROR(msg) isc::d2::D2ParserContext::fatal(msg)
-#line 1218 "d2_lexer.cc"
+#line 1217 "d2_lexer.cc"
/* noyywrap disables automatic rewinding for the next file to parse. Since we
always parse only a single string, there's no need to do any wraps. And
using yywrap requires linking with -lfl, which provides the default yywrap
by moving it ahead by yyleng bytes. yyleng specifies the length of the
currently matched token. */
#define YY_USER_ACTION driver.loc_.columns(yyleng);
+#line 1243 "d2_lexer.cc"
#line 1244 "d2_lexer.cc"
-#line 1245 "d2_lexer.cc"
#define INITIAL 0
#define COMMENT 1
}
-#line 1565 "d2_lexer.cc"
+#line 1564 "d2_lexer.cc"
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
#line 1022 "d2_lexer.ll"
ECHO;
YY_BREAK
-#line 2816 "d2_lexer.cc"
+#line 2815 "d2_lexer.cc"
case YY_END_OF_BUFFER:
{
-#line 2 "dhcp4_lexer.cc"
+#line 1 "dhcp4_lexer.cc"
-#line 4 "dhcp4_lexer.cc"
+#line 3 "dhcp4_lexer.cc"
#define YY_INT_ALIGNED short int
/* To avoid the call to exit... oops! */
#define YY_FATAL_ERROR(msg) isc::dhcp::Parser4Context::fatal(msg)
-#line 2315 "dhcp4_lexer.cc"
+#line 2314 "dhcp4_lexer.cc"
/* noyywrap disables automatic rewinding for the next file to parse. Since we
always parse only a single string, there's no need to do any wraps. And
using yywrap requires linking with -lfl, which provides the default yywrap
by moving it ahead by yyleng bytes. yyleng specifies the length of the
currently matched token. */
#define YY_USER_ACTION driver.loc_.columns(yyleng);
+#line 2340 "dhcp4_lexer.cc"
#line 2341 "dhcp4_lexer.cc"
-#line 2342 "dhcp4_lexer.cc"
#define INITIAL 0
#define COMMENT 1
}
-#line 2670 "dhcp4_lexer.cc"
+#line 2669 "dhcp4_lexer.cc"
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
#line 2642 "dhcp4_lexer.ll"
ECHO;
YY_BREAK
-#line 6012 "dhcp4_lexer.cc"
+#line 6011 "dhcp4_lexer.cc"
case YY_END_OF_BUFFER:
{
-#line 2 "dhcp6_lexer.cc"
+#line 1 "dhcp6_lexer.cc"
-#line 4 "dhcp6_lexer.cc"
+#line 3 "dhcp6_lexer.cc"
#define YY_INT_ALIGNED short int
/* To avoid the call to exit... oops! */
#define YY_FATAL_ERROR(msg) isc::dhcp::Parser6Context::fatal(msg)
-#line 2288 "dhcp6_lexer.cc"
+#line 2287 "dhcp6_lexer.cc"
/* noyywrap disables automatic rewinding for the next file to parse. Since we
always parse only a single string, there's no need to do any wraps. And
using yywrap requires linking with -lfl, which provides the default yywrap
by moving it ahead by yyleng bytes. yyleng specifies the length of the
currently matched token. */
#define YY_USER_ACTION driver.loc_.columns(yyleng);
+#line 2313 "dhcp6_lexer.cc"
#line 2314 "dhcp6_lexer.cc"
-#line 2315 "dhcp6_lexer.cc"
#define INITIAL 0
#define COMMENT 1
}
-#line 2645 "dhcp6_lexer.cc"
+#line 2644 "dhcp6_lexer.cc"
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
#line 2675 "dhcp6_lexer.ll"
ECHO;
YY_BREAK
-#line 6027 "dhcp6_lexer.cc"
+#line 6026 "dhcp6_lexer.cc"
case YY_END_OF_BUFFER:
{
-// Copyright (C) 2015-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-% FLEX_ID_NO_IDENTIFIER_EXPRESSION identifier-expression is either not specified or empty
-Logged at debug log level 40.
-This debug message is printed when the flex-id library is being loaded,
-but the expression used to generate the identifier was either omitted or
-is empty. The library will load, but will neither generate nor replace
-client identifiers. Typically this occurs when users are only interested
-in using ignore-iaid, which operates independently of the expression.
-
% FLEX_ID_EXPRESSION_EVALUATED Expression evaluated for packet to "%1" (size: %2)
Logged at debug log level 40.
This debug message is printed every time a packet evaluation is successful.
loading of the library. Details of the problem are printed as parameter
to this message.
+% FLEX_ID_NO_IDENTIFIER_EXPRESSION identifier-expression is either not specified or empty
+Logged at debug log level 40.
+This debug message is printed when the flex-id library is being loaded,
+but the expression used to generate the identifier was either omitted or
+is empty. The library will load, but will neither generate nor replace
+client identifiers. Typically this occurs when users are only interested
+in using ignore-iaid, which operates independently of the expression.
+
% FLEX_ID_REPLACE_CLIENT_ID_JSON_TYPE the replace-client-id is %1 but expected boolean value
This error message is printed when the flex-id library is being loaded,
but the replace-client-id parameter is malformed, i.e. it has a different
-// Copyright (C) 2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2024-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2018-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2018-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2011-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2015-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2015-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2015-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2013-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2013-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2014-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2014-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2011-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2011-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2011-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
This is an informational message reporting that the configuration has
been extended to include the specified subnet.
+% DHCPSRV_CFGMGR_OPTION_DEFINITION_MISMATCH failed to create option: %1
+This warning message is issued when an option has been specified for which
+there is no suitable option definition. Either there is no definition at all
+or the option contents do not fit the option definition. The argument will
+provide a detailed reason for the failure. The server will continue to
+operate but it will exclude the option from packet processing until the
+situation is corrected. This is considered a configuration error.
+
% DHCPSRV_CFGMGR_OPTION_DUPLICATE multiple options with the code: %1 added to the subnet: %2
This warning message is issued on an attempt to configure multiple options with the
same option code for the particular subnet. Adding multiple options is uncommon
does not comply with the supported path. The server will
still use the specified path but is warning that doing so may
pose a security risk.
-
-% DHCPSRV_CFGMGR_OPTION_DEFINITION_MISMATCH failed to create option: %1
-This warning message is issued when an option has been specified for which
-there is no suitable option definition. Either there is no definition at all
-or the option contents do not fit the option definition. The argument will
-provide a detailed reason for the failure. The server will continue to
-operate but it will exclude the option from packet processing until the
-situation is corrected. This is considered a configuration error.
-// Copyright (C) 2019-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2019-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2012-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2012-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-#line 2 "lexer.cc"
+#line 1 "lexer.cc"
-#line 4 "lexer.cc"
+#line 3 "lexer.cc"
#define YY_INT_ALIGNED short int
/* To avoid the call to exit... oops! */
#define YY_FATAL_ERROR(msg) isc::eval::EvalContext::fatal(msg)
-#line 1059 "lexer.cc"
+#line 1058 "lexer.cc"
/* noyywrap disables automatic rewinding for the next file to parse. Since we
always parse only a single string, there's no need to do any wraps. And
using yywrap requires linking with -lfl, which provides the default yywrap
by moving it ahead by yyleng bytes. yyleng specifies the length of the
currently matched token. */
#define YY_USER_ACTION loc.columns(evalleng);
+#line 1083 "lexer.cc"
#line 1084 "lexer.cc"
-#line 1085 "lexer.cc"
#define INITIAL 0
-#line 1384 "lexer.cc"
+#line 1383 "lexer.cc"
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
#line 251 "lexer.ll"
ECHO;
YY_BREAK
-#line 1893 "lexer.cc"
+#line 1892 "lexer.cc"
case YY_END_OF_BUFFER:
{
-// Copyright (C) 2015-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2015-2020 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2015-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2015-2023 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2015-2020 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2015-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2011-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2011-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2015-2021 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2011-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
-// Copyright (C) 2018-2022 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2018-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this