+Kea 3.1.1 (development) released on September 27, 2025
+
+2391. [bug] fdupont
+ When reusing an expired lease, kea-dhcp6 now correctly saves
+ the client hardware address in the lease.
+ (Gitlab #4058)
+
+2390. [func] fdupont
+ Added the new "adaptive-lease-time-threshold" parameter
+ for the FLQ (Free Lease Queue) allocator which reduces
+ the lifetime of leases when pools of a subnet have an
+ occupancy rate above a configured threshold (new feature
+ from ISC DHCP).
+ (Gitlab #226)
+
+2389. [bug] tmark
+ Corrected an issue in kea-dhcp4 which caused
+ broadcasted client queries to fail to match subnets
+ restricted to classes assigned during early global
+ host lookups.
+ (Gitlab #4047)
+
+2388. [bug] tmark
+ Fixed an issue in kea-dhcp-ddns which was
+ causing GSS-TSIG key exchanges to timeout when
+ NCR traffic is intermittent.
+ (Gitlab #4049)
+
+2387. [func]* andrei, razvan
+ Updated kea-netconf to libyang and sysrepo version 3.
+ (Gitlab #3931)
+
+2386. [sec] tmark
+ Corrected an issue in kea-dhcp4 that caused
+ the server to exit after receiving a broadcast
+ query that requests option 108 and fails to
+ match a subnet.
+ CVE:2025-40779
+ (Gitlab #4048)
+
+2385. [bug] tmark
+ Avoid adding the qualifying-suffix to fully qualified
+ host names specified in host reservations.
+ (Gitlab #3949)
+
+2384. [bug] tmark
+ kea-dhcp6 now correctly supports option class-tags
+ (i.e."client-classes") in host and config back ends
+ for both MySQL and PosgreSQL.
+ (Gitlab #4014)
+
2383. [func] razvan
The kea-dhcp4 server now supports configuring vivso options with
suboptions.
+++ /dev/null
-[func] fdupont
- Added the new "adaptive-lease-time-threshold" parameter
- for the FLQ (Free Lease Queue) allocator which reduces
- the lifetime of leases when pools of a subnet have an
- occupancy rate above a configured threshold (new feature
- from ISC DHCP).
- (Gitlab #226)
+++ /dev/null
-[func]* andrei, razvan
- Updated kea-netconf to libyang and sysrepo version 3.
- (Gitlab #3931)
+++ /dev/null
-[bug] tmark
- Avoid adding the qualifying-suffix to fully qualified
- host names specified in host reservations.
- (Gitlab #3949)
+++ /dev/null
-[bug] tmark
- kea-dhcp6 now correctly supports option class-tags
- (i.e."client-classes") in host and config back ends
- for both MySQL and PosgreSQL.
- (Gitlab #4014)
+++ /dev/null
-[bug] tmark
- Corrected an issue in kea-dhcp4 which caused
- broadcasted client queries to fail to match subnets
- restricted to classes assigned during early global
- host lookups.
- (Gitlab #4047)
+++ /dev/null
-[bug] tmark
- Fixed an issue in kea-dhcp-ddns which was
- causing GSS-TSIG key exchanges to timeout when
- NCR traffic is intermittent.
- (Gitlab #4049)
+++ /dev/null
-[bug] fdupont
- When reusing an expired lease, kea-dhcp6 now correctly saves
- the client hardware address in the lease.
- (Gitlab #4058)
+++ /dev/null
-[sec] tmark
- Corrected an issue in kea-dhcp4 that caused
- the server to exit after receiving a broadcast
- query that requests option 108 and fails to
- match a subnet.
- CVE:2025-40779
- (Gitlab #4048)
src/share/api/lease6-get.json
src/share/api/lease6-get-all.json
src/share/api/lease6-get-by-duid.json
-src/share/api/lease6-get-by-hw-address.json
src/share/api/lease6-get-by-hostname.json
+src/share/api/lease6-get-by-hw-address.json
src/share/api/lease6-get-page.json
src/share/api/lease6-resend-ddns.json
src/share/api/lease6-update.json
- DHCPSRV_MEMFILE_GET_EXPIRED6
- DHCPSRV_MEMFILE_GET_HOSTNAME4
- DHCPSRV_MEMFILE_GET_HOSTNAME6
-- DHCPSRV_MEMFILE_GET_HWADDR
+- DHCPSRV_MEMFILE_GET_HWADDR4
+- DHCPSRV_MEMFILE_GET_HWADDR6
- DHCPSRV_MEMFILE_GET_IAID_DUID
- DHCPSRV_MEMFILE_GET_IAID_SUBID_DUID
- DHCPSRV_MEMFILE_GET_PAGE4
- MYSQL_LB_GET_EXPIRED6
- MYSQL_LB_GET_HOSTNAME4
- MYSQL_LB_GET_HOSTNAME6
-- MYSQL_LB_GET_HWADDR
+- MYSQL_LB_GET_HWADDR4
+- MYSQL_LB_GET_HWADDR6
- MYSQL_LB_GET_IAID_DUID
- MYSQL_LB_GET_IAID_SUBID_DUID
- MYSQL_LB_GET_PAGE4
- PGSQL_LB_GET_EXPIRED6
- PGSQL_LB_GET_HOSTNAME4
- PGSQL_LB_GET_HOSTNAME6
-- PGSQL_LB_GET_HWADDR
+- PGSQL_LB_GET_HWADDR4
+- PGSQL_LB_GET_HWADDR6
- PGSQL_LB_GET_IAID_DUID
- PGSQL_LB_GET_IAID_SUBID_DUID
- PGSQL_LB_GET_PAGE4
| t2_percent
| cache_threshold
| cache_max_age
+ | adaptive_lease_time_threshold
| loggers
| hostname_char_set
| hostname_char_replacement
cache_max_age ::= "cache-max-age" ":" INTEGER
+ adaptive_lease_time_threshold ::= "adaptive-lease-time-threshold" ":" FLOAT
+
decline_probation_period ::= "decline-probation-period" ":" INTEGER
server_tag ::= "server-tag" ":" STRING
| t2_percent
| cache_threshold
| cache_max_age
+ | adaptive_lease_time_threshold
| ddns_send_updates
| ddns_override_no_update
| ddns_override_client_update
| t2_percent
| cache_threshold
| cache_max_age
+ | adaptive_lease_time_threshold
| ddns_send_updates
| ddns_override_no_update
| ddns_override_client_update
| t2_percent
| cache_threshold
| cache_max_age
+ | adaptive_lease_time_threshold
| loggers
| hostname_char_set
| hostname_char_replacement
cache_max_age ::= "cache-max-age" ":" INTEGER
+ adaptive_lease_time_threshold ::= "adaptive-lease-time-threshold" ":" FLOAT
+
decline_probation_period ::= "decline-probation-period" ":" INTEGER
ddns_send_updates ::= "ddns-send-updates" ":" BOOLEAN
| t2_percent
| cache_threshold
| cache_max_age
+ | adaptive_lease_time_threshold
| hostname_char_set
| hostname_char_replacement
| ddns_send_updates
| t2_percent
| cache_threshold
| cache_max_age
+ | adaptive_lease_time_threshold
| hostname_char_set
| hostname_char_replacement
| ddns_send_updates
IPv6 leases from the memory file database for a client with the specified
hostname.
-DHCPSRV_MEMFILE_GET_HWADDR
-==========================
+DHCPSRV_MEMFILE_GET_HWADDR4
+===========================
.. code-block:: text
IPv4 leases from the memory file database for a client with the specified
hardware address.
+DHCPSRV_MEMFILE_GET_HWADDR6
+===========================
+
+.. code-block:: text
+
+ obtaining IPv6 leases for hardware address %1
+
+Logged at debug log level 50.
+A debug message issued when the server is attempting to obtain a set of
+IPv6 leases from the memory file database for a client with the specified
+hardware address.
+
DHCPSRV_MEMFILE_GET_IAID_DUID
=============================
of IPv6 leases from the MySQL database for a client with the specified
hostname.
-MYSQL_LB_GET_HWADDR
-===================
+MYSQL_LB_GET_HWADDR4
+====================
.. code-block:: text
of IPv4 leases from the MySQL database for a client with the specified
hardware address.
+MYSQL_LB_GET_HWADDR6
+====================
+
+.. code-block:: text
+
+ obtaining IPv6 leases for hardware address %1
+
+Logged at debug log level 50.
+A debug message issued when the server is attempting to obtain a set
+of IPv6 leases from the MySQL database for a client with the specified
+hardware address.
+
MYSQL_LB_GET_IAID_DUID
======================
of IPv6 leases from the PostgreSQL database for a client with the specified
hostname.
-PGSQL_LB_GET_HWADDR
-===================
+PGSQL_LB_GET_HWADDR4
+====================
.. code-block:: text
of IPv4 leases from the PostgreSQL database for a client with the specified
hardware address.
+PGSQL_LB_GET_HWADDR6
+====================
+
+.. code-block:: text
+
+ obtaining IPv6 leases for hardware address %1
+
+Logged at debug log level 50.
+A debug message issued when the server is attempting to obtain a set
+of IPv6 leases from the PostgreSQL database for a client with the specified
+hardware address.
+
PGSQL_LB_GET_IAID_DUID
======================
..
- 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
typedef uint16_t flex_uint16_t;
typedef int32_t flex_int32_t;
typedef uint32_t flex_uint32_t;
-typedef uint64_t flex_uint64_t;
#else
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
#endif
/* %if-not-reentrant */
-extern yy_size_t yyleng;
+extern int yyleng;
/* %endif */
/* %if-c-only */
/* Number of characters read into yy_ch_buf, not including EOB
* characters.
*/
- yy_size_t yy_n_chars;
+ int yy_n_chars;
/* Whether we "own" the buffer - i.e., we know we created it,
* and can realloc() it to grow it, and should free() it to
/* %not-for-header */
/* yy_hold_char holds the character lost when yytext is formed. */
static char yy_hold_char;
-static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
-yy_size_t yyleng;
+static int yy_n_chars; /* number of characters read into yy_ch_buf */
+int yyleng;
/* Points to current character in buffer. */
static char *yy_c_buf_p = NULL;
YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size );
YY_BUFFER_STATE yy_scan_string ( const char *yy_str );
-YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, yy_size_t len );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len );
/* %endif */
#define YY_DO_BEFORE_ACTION \
(yytext_ptr) = yy_bp; \
/* %% [2.0] code to fiddle yytext and yyleng for yymore() goes here \ */\
- yyleng = (yy_size_t) (yy_cp - yy_bp); \
+ yyleng = (int) (yy_cp - yy_bp); \
(yy_hold_char) = *yy_cp; \
*yy_cp = '\0'; \
/* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\
/* 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
void yyset_out ( FILE * _out_str );
- yy_size_t yyget_leng ( void );
+ int yyget_leng ( void );
char *yyget_text ( void );
if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
{ \
int c = '*'; \
- yy_size_t n; \
+ int n; \
for ( n = 0; n < max_size && \
(c = getc( yyin )) != EOF && c != '\n'; ++n ) \
buf[n] = (char) c; \
}
-#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:
{
else
{
- yy_size_t num_to_read =
+ int num_to_read =
YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
while ( num_to_read <= 0 )
if ( b->yy_is_our_buffer )
{
- yy_size_t new_size = b->yy_buf_size * 2;
+ int new_size = b->yy_buf_size * 2;
if ( new_size <= 0 )
b->yy_buf_size += b->yy_buf_size / 8;
if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
/* Extend the array by 50%, plus the number we really need. */
- yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
(void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size );
if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
else
{ /* need more input */
- yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ int offset = (int) ((yy_c_buf_p) - (yytext_ptr));
++(yy_c_buf_p);
switch ( yy_get_next_buffer( ) )
*
* @return the newly allocated buffer state object.
*/
-YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, yy_size_t _yybytes_len )
+YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len )
{
YY_BUFFER_STATE b;
char *buf;
yy_size_t n;
- yy_size_t i;
+ int i;
/* Get memory for full buffer, including space for trailing EOB's. */
n = (yy_size_t) (_yybytes_len + 2);
do \
{ \
/* Undo effects of setting up yytext. */ \
- yy_size_t yyless_macro_arg = (n); \
+ int yyless_macro_arg = (n); \
YY_LESS_LINENO(yyless_macro_arg);\
yytext[yyleng] = (yy_hold_char); \
(yy_c_buf_p) = yytext + yyless_macro_arg; \
/** Get the length of the current token.
*
*/
-yy_size_t yyget_leng (void)
+int yyget_leng (void)
{
return yyleng;
}
-// 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) 2016-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2016-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
typedef uint16_t flex_uint16_t;
typedef int32_t flex_int32_t;
typedef uint32_t flex_uint32_t;
-typedef uint64_t flex_uint64_t;
#else
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
#endif
/* %if-not-reentrant */
-extern yy_size_t yyleng;
+extern int yyleng;
/* %endif */
/* %if-c-only */
/* Number of characters read into yy_ch_buf, not including EOB
* characters.
*/
- yy_size_t yy_n_chars;
+ int yy_n_chars;
/* Whether we "own" the buffer - i.e., we know we created it,
* and can realloc() it to grow it, and should free() it to
/* %not-for-header */
/* yy_hold_char holds the character lost when yytext is formed. */
static char yy_hold_char;
-static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
-yy_size_t yyleng;
+static int yy_n_chars; /* number of characters read into yy_ch_buf */
+int yyleng;
/* Points to current character in buffer. */
static char *yy_c_buf_p = NULL;
YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size );
YY_BUFFER_STATE yy_scan_string ( const char *yy_str );
-YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, yy_size_t len );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len );
/* %endif */
#define YY_DO_BEFORE_ACTION \
(yytext_ptr) = yy_bp; \
/* %% [2.0] code to fiddle yytext and yyleng for yymore() goes here \ */\
- yyleng = (yy_size_t) (yy_cp - yy_bp); \
+ yyleng = (int) (yy_cp - yy_bp); \
(yy_hold_char) = *yy_cp; \
*yy_cp = '\0'; \
/* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\
/* 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
void yyset_out ( FILE * _out_str );
- yy_size_t yyget_leng ( void );
+ int yyget_leng ( void );
char *yyget_text ( void );
if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
{ \
int c = '*'; \
- yy_size_t n; \
+ int n; \
for ( n = 0; n < max_size && \
(c = getc( yyin )) != EOF && c != '\n'; ++n ) \
buf[n] = (char) c; \
}
-#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:
{
else
{
- yy_size_t num_to_read =
+ int num_to_read =
YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
while ( num_to_read <= 0 )
if ( b->yy_is_our_buffer )
{
- yy_size_t new_size = b->yy_buf_size * 2;
+ int new_size = b->yy_buf_size * 2;
if ( new_size <= 0 )
b->yy_buf_size += b->yy_buf_size / 8;
if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
/* Extend the array by 50%, plus the number we really need. */
- yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
(void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size );
if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
else
{ /* need more input */
- yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ int offset = (int) ((yy_c_buf_p) - (yytext_ptr));
++(yy_c_buf_p);
switch ( yy_get_next_buffer( ) )
*
* @return the newly allocated buffer state object.
*/
-YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, yy_size_t _yybytes_len )
+YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len )
{
YY_BUFFER_STATE b;
char *buf;
yy_size_t n;
- yy_size_t i;
+ int i;
/* Get memory for full buffer, including space for trailing EOB's. */
n = (yy_size_t) (_yybytes_len + 2);
do \
{ \
/* Undo effects of setting up yytext. */ \
- yy_size_t yyless_macro_arg = (n); \
+ int yyless_macro_arg = (n); \
YY_LESS_LINENO(yyless_macro_arg);\
yytext[yyleng] = (yy_hold_char); \
(yy_c_buf_p) = yytext + yyless_macro_arg; \
/** Get the length of the current token.
*
*/
-yy_size_t yyget_leng (void)
+int yyget_leng (void)
{
return yyleng;
}
-// Copyright (C) 2017-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2017-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) 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) 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) 2022-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2022-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) 2022-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2022-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) 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) 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) 2022-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2022-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) 2022-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2022-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) 2019-2021 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) 2019-2021 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) 2019-2022 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) 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) 2023 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2023-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) 2023 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2023-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) 2023 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2023-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) 2017-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2017-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) 2023 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2023-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) 2023-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2023-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) 2023-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2023-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) 2022-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2022-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) 2019-2021 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-2015 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