summary refs log tree commit diff
path: root/src/core/dhcp
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2022-01-13 22:30:39 +0100
committerMichael Biebl <biebl@debian.org>2022-01-13 22:30:39 +0100
commit88c227d90a6b7b388c5c85d72802a0ca8f05ed5c (patch)
tree71f32df6617802270e8a78574bd8e1637dc532f4 /src/core/dhcp
parente74c568b07b50b97873fb4ee1d776dedefbd54d6 (diff)
New upstream version 1.34.0 upstream/1.34.0
Diffstat (limited to 'src/core/dhcp')
-rw-r--r--src/core/dhcp/nm-dhcp-client.c112
-rw-r--r--src/core/dhcp/nm-dhcp-client.h34
-rw-r--r--src/core/dhcp/nm-dhcp-dhclient-utils.c10
-rw-r--r--src/core/dhcp/nm-dhcp-dhclient.c60
-rw-r--r--src/core/dhcp/nm-dhcp-dhcpcanon.c47
-rw-r--r--src/core/dhcp/nm-dhcp-dhcpcd.c47
-rw-r--r--src/core/dhcp/nm-dhcp-helper.c4
-rw-r--r--src/core/dhcp/nm-dhcp-listener.c3
-rw-r--r--src/core/dhcp/nm-dhcp-manager.c145
-rw-r--r--src/core/dhcp/nm-dhcp-nettools.c14
-rw-r--r--src/core/dhcp/nm-dhcp-systemd.c22
-rw-r--r--src/core/dhcp/nm-dhcp-utils.c20
-rw-r--r--src/core/dhcp/tests/test-dhcp-dhclient.c4
13 files changed, 235 insertions, 287 deletions
diff --git a/src/core/dhcp/nm-dhcp-client.c b/src/core/dhcp/nm-dhcp-client.c
index ab8243d0..f88c79c0 100644
--- a/src/core/dhcp/nm-dhcp-client.c
+++ b/src/core/dhcp/nm-dhcp-client.c
@@ -28,7 +28,7 @@
 
 /*****************************************************************************/
 
-enum { SIGNAL_STATE_CHANGED, SIGNAL_PREFIX_DELEGATED, LAST_SIGNAL };
+enum { SIGNAL_NOTIFY, LAST_SIGNAL };
 
 static guint signals[LAST_SIGNAL] = {0};
 
@@ -78,6 +78,7 @@ typedef struct _NMDhcpClientPrivate {
     NMDhcpHostnameFlags hostname_flags;
     NMDhcpClientFlags   client_flags;
     bool                iaid_explicit : 1;
+    bool                is_stopped : 1;
 } NMDhcpClientPrivate;
 
 G_DEFINE_ABSTRACT_TYPE(NMDhcpClient, nm_dhcp_client, G_TYPE_OBJECT)
@@ -91,6 +92,33 @@ G_STATIC_ASSERT(!(((pid_t) -1) > 0));
 
 /*****************************************************************************/
 
+static void
+_emit_notify(NMDhcpClient *self, const NMDhcpClientNotifyData *notify_data)
+{
+    g_signal_emit(G_OBJECT(self), signals[SIGNAL_NOTIFY], 0, notify_data);
+}
+
+static void
+_emit_notify_state_changed(NMDhcpClient *self,
+                           NMDhcpState   dhcp_state,
+                           NMIPConfig *  ip_config,
+                           GHashTable *  options)
+{
+    const NMDhcpClientNotifyData notify_data = {
+        .notify_type = NM_DHCP_CLIENT_NOTIFY_TYPE_STATE_CHANGED,
+        .state_changed =
+            {
+                .dhcp_state = dhcp_state,
+                .ip_config  = ip_config,
+                .options    = options,
+            },
+    };
+
+    _emit_notify(self, &notify_data);
+}
+
+/*****************************************************************************/
+
 pid_t
 nm_dhcp_client_get_pid(NMDhcpClient *self)
 {
@@ -352,8 +380,7 @@ NM_UTILS_LOOKUP_STR_DEFINE(nm_dhcp_state_to_string,
                            NM_UTILS_LOOKUP_STR_ITEM(NM_DHCP_STATE_NOOP, "noop"),
                            NM_UTILS_LOOKUP_STR_ITEM(NM_DHCP_STATE_TERMINATED, "terminated"),
                            NM_UTILS_LOOKUP_STR_ITEM(NM_DHCP_STATE_TIMEOUT, "timeout"),
-                           NM_UTILS_LOOKUP_STR_ITEM(NM_DHCP_STATE_UNKNOWN, "unknown"),
-                           NM_UTILS_LOOKUP_ITEM_IGNORE(__NM_DHCP_STATE_MAX), );
+                           NM_UTILS_LOOKUP_STR_ITEM(NM_DHCP_STATE_UNKNOWN, "unknown"), );
 
 static NMDhcpState
 reason_to_state(NMDhcpClient *self, const char *iface, const char *reason)
@@ -469,7 +496,7 @@ nm_dhcp_client_set_state(NMDhcpClient *self,
         gs_free const char **keys = NULL;
         guint                i, nkeys;
 
-        keys = nm_utils_strdict_get_keys(options, TRUE, &nkeys);
+        keys = nm_strdict_get_keys(options, TRUE, &nkeys);
         for (i = 0; i < nkeys; i++) {
             _LOGD("option %-20s => '%s'", keys[i], (char *) g_hash_table_lookup(options, keys[i]));
         }
@@ -497,7 +524,8 @@ nm_dhcp_client_set_state(NMDhcpClient *self,
     }
 
     priv->state = new_state;
-    g_signal_emit(G_OBJECT(self), signals[SIGNAL_STATE_CHANGED], 0, new_state, ip_config, options);
+
+    _emit_notify_state_changed(self, new_state, ip_config, options);
 }
 
 static gboolean
@@ -608,6 +636,20 @@ nm_dhcp_client_accept(NMDhcpClient *self, GError **error)
 }
 
 gboolean
+nm_dhcp_client_can_accept(NMDhcpClient *self)
+{
+    gboolean can_accept;
+
+    g_return_val_if_fail(NM_IS_DHCP_CLIENT(self), FALSE);
+
+    can_accept = !!(NM_DHCP_CLIENT_GET_CLASS(self)->accept);
+
+    nm_assert(can_accept == (!!(NM_DHCP_CLIENT_GET_CLASS(self)->decline)));
+
+    return can_accept;
+}
+
+gboolean
 nm_dhcp_client_decline(NMDhcpClient *self, const char *error_message, GError **error)
 {
     g_return_val_if_fail(NM_IS_DHCP_CLIENT(self), FALSE);
@@ -733,6 +775,11 @@ nm_dhcp_client_stop(NMDhcpClient *self, gboolean release)
 
     priv = NM_DHCP_CLIENT_GET_PRIVATE(self);
 
+    if (priv->is_stopped)
+        return;
+
+    priv->is_stopped = TRUE;
+
     /* Kill the DHCP client */
     old_pid = priv->pid;
     NM_DHCP_CLIENT_GET_CLASS(self)->stop(self, release);
@@ -855,7 +902,15 @@ maybe_add_option(NMDhcpClient *self, GHashTable *hash, const char *key, GVariant
 void
 nm_dhcp_client_emit_ipv6_prefix_delegated(NMDhcpClient *self, const NMPlatformIP6Address *prefix)
 {
-    g_signal_emit(G_OBJECT(self), signals[SIGNAL_PREFIX_DELEGATED], 0, prefix);
+    const NMDhcpClientNotifyData notify_data = {
+        .notify_type = NM_DHCP_CLIENT_NOTIFY_TYPE_PREFIX_DELEGATED,
+        .prefix_delegated =
+            {
+                .prefix = prefix,
+            },
+    };
+
+    _emit_notify(self, &notify_data);
 }
 
 gboolean
@@ -1124,7 +1179,7 @@ set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *ps
         break;
     case PROP_REJECT_SERVERS:
         /* construct-only */
-        priv->reject_servers = nm_utils_strv_dup_packed(g_value_get_boxed(value), -1);
+        priv->reject_servers = nm_strv_dup_packed(g_value_get_boxed(value), -1);
         break;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
@@ -1142,8 +1197,6 @@ nm_dhcp_client_init(NMDhcpClient *self)
     priv        = G_TYPE_INSTANCE_GET_PRIVATE(self, NM_TYPE_DHCP_CLIENT, NMDhcpClientPrivate);
     self->_priv = priv;
 
-    c_list_init(&self->dhcp_client_lst);
-
     priv->pid = -1;
 }
 
@@ -1175,12 +1228,7 @@ dispose(GObject *object)
     NMDhcpClient *       self = NM_DHCP_CLIENT(object);
     NMDhcpClientPrivate *priv = NM_DHCP_CLIENT_GET_PRIVATE(self);
 
-    /* Stopping the client is left up to the controlling device
-     * explicitly since we may want to quit NetworkManager but not terminate
-     * the DHCP client.
-     */
-
-    nm_assert(c_list_is_empty(&self->dhcp_client_lst));
+    nm_dhcp_client_stop(self, FALSE);
 
     watch_cleanup(self);
     timeout_cleanup(self);
@@ -1369,27 +1417,15 @@ nm_dhcp_client_class_init(NMDhcpClientClass *client_class)
 
     g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
 
-    signals[SIGNAL_STATE_CHANGED] = g_signal_new(NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED,
-                                                 G_OBJECT_CLASS_TYPE(object_class),
-                                                 G_SIGNAL_RUN_FIRST,
-                                                 0,
-                                                 NULL,
-                                                 NULL,
-                                                 NULL,
-                                                 G_TYPE_NONE,
-                                                 3,
-                                                 G_TYPE_UINT,
-                                                 G_TYPE_OBJECT,
-                                                 G_TYPE_HASH_TABLE);
-
-    signals[SIGNAL_PREFIX_DELEGATED] = g_signal_new(NM_DHCP_CLIENT_SIGNAL_PREFIX_DELEGATED,
-                                                    G_OBJECT_CLASS_TYPE(object_class),
-                                                    G_SIGNAL_RUN_FIRST,
-                                                    0,
-                                                    NULL,
-                                                    NULL,
-                                                    NULL,
-                                                    G_TYPE_NONE,
-                                                    1,
-                                                    G_TYPE_POINTER);
+    signals[SIGNAL_NOTIFY] =
+        g_signal_new(NM_DHCP_CLIENT_NOTIFY,
+                     G_OBJECT_CLASS_TYPE(object_class),
+                     G_SIGNAL_RUN_FIRST,
+                     0,
+                     NULL,
+                     NULL,
+                     g_cclosure_marshal_VOID__POINTER,
+                     G_TYPE_NONE,
+                     1,
+                     G_TYPE_POINTER /* const NMDhcpClientNotifyData *notify_data */);
 }
diff --git a/src/core/dhcp/nm-dhcp-client.h b/src/core/dhcp/nm-dhcp-client.h
index 3fe1b34e..2e7e0216 100644
--- a/src/core/dhcp/nm-dhcp-client.h
+++ b/src/core/dhcp/nm-dhcp-client.h
@@ -44,8 +44,7 @@
 #define NM_DHCP_CLIENT_VENDOR_CLASS_IDENTIFIER "vendor-class-identifier"
 #define NM_DHCP_CLIENT_REJECT_SERVERS          "reject-servers"
 
-#define NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED    "state-changed"
-#define NM_DHCP_CLIENT_SIGNAL_PREFIX_DELEGATED "prefix-delegated"
+#define NM_DHCP_CLIENT_NOTIFY "dhcp-notify"
 
 typedef enum {
     NM_DHCP_STATE_UNKNOWN = 0,
@@ -57,10 +56,27 @@ typedef enum {
     NM_DHCP_STATE_FAIL,       /* failed for some reason */
     NM_DHCP_STATE_TERMINATED, /* client is no longer running */
     NM_DHCP_STATE_NOOP,       /* state is a non operation for NetworkManager */
-    __NM_DHCP_STATE_MAX,
-    NM_DHCP_STATE_MAX = __NM_DHCP_STATE_MAX - 1,
 } NMDhcpState;
 
+typedef enum _nm_packed {
+    NM_DHCP_CLIENT_NOTIFY_TYPE_STATE_CHANGED,
+    NM_DHCP_CLIENT_NOTIFY_TYPE_PREFIX_DELEGATED,
+} NMDhcpClientNotifyType;
+
+typedef struct {
+    NMDhcpClientNotifyType notify_type;
+    union {
+        struct {
+            NMIPConfig *ip_config;
+            GHashTable *options;
+            NMDhcpState dhcp_state;
+        } state_changed;
+        struct {
+            const NMPlatformIP6Address *prefix;
+        } prefix_delegated;
+    };
+} NMDhcpClientNotifyData;
+
 const char *nm_dhcp_state_to_string(NMDhcpState state);
 
 struct _NMDhcpClientPrivate;
@@ -68,7 +84,6 @@ struct _NMDhcpClientPrivate;
 typedef struct {
     GObject                      parent;
     struct _NMDhcpClientPrivate *_priv;
-    CList                        dhcp_client_lst;
 } NMDhcpClient;
 
 typedef enum _nm_packed {
@@ -173,6 +188,7 @@ gboolean nm_dhcp_client_start_ip6(NMDhcpClient *            self,
                                   GError **                 error);
 
 gboolean nm_dhcp_client_accept(NMDhcpClient *self, GError **error);
+gboolean nm_dhcp_client_can_accept(NMDhcpClient *self);
 
 gboolean nm_dhcp_client_decline(NMDhcpClient *self, const char *error_message, GError **error);
 
@@ -217,11 +233,13 @@ gboolean nm_dhcp_client_server_id_is_rejected(NMDhcpClient *self, gconstpointer
  *****************************************************************************/
 
 typedef struct {
-    GType (*get_type)(void);
-    GType (*get_type_per_addr_family)(int addr_family);
+    GType (*get_type_4)(void);
+    GType (*get_type_6)(void);
     const char *name;
     const char *(*get_path)(void);
-    bool experimental : 1;
+
+    /* whether this plugin is an undocumented, internal plugin. */
+    bool undocumented : 1;
 } NMDhcpClientFactory;
 
 GType nm_dhcp_nettools_get_type(void);
diff --git a/src/core/dhcp/nm-dhcp-dhclient-utils.c b/src/core/dhcp/nm-dhcp-dhclient-utils.c
index 4284a852..341ac7b2 100644
--- a/src/core/dhcp/nm-dhcp-dhclient-utils.c
+++ b/src/core/dhcp/nm-dhcp-dhclient-utils.c
@@ -59,7 +59,7 @@ grab_request_options(GPtrArray *store, const char *line)
     gsize                i;
 
     /* Grab each 'request' or 'also request'  option and save for later */
-    line_v = nm_utils_strsplit_set(line, "\t ,");
+    line_v = nm_strsplit_set(line, "\t ,");
     for (i = 0; line_v && line_v[i]; i++) {
         const char *ss = nm_str_skip_leading_spaces(line_v[i]);
         gsize       l;
@@ -282,7 +282,7 @@ read_interface(const char *line, char *interface, guint size)
     if (ptr[0] == '\0' || strlen(ptr) + 1 > size)
         return FALSE;
 
-    snprintf(interface, size, "%s", ptr);
+    g_snprintf(interface, size, "%s", ptr);
 
     return TRUE;
 }
@@ -330,7 +330,7 @@ nm_dhcp_dhclient_create_config(const char *        interface,
         g_string_append_printf(new_contents, _("# Merged from %s\n\n"), orig_path);
         intf[0] = '\0';
 
-        lines = nm_utils_strsplit_set(orig_contents, "\n\r");
+        lines = nm_strsplit_set(orig_contents, "\n\r");
         for (line_i = 0; lines && lines[line_i]; line_i++) {
             const char *line = nm_str_skip_leading_spaces(lines[line_i]);
             const char *p;
@@ -620,7 +620,7 @@ nm_dhcp_dhclient_read_duid(const char *leasefile, GError **error)
     if (!g_file_get_contents(leasefile, &contents, NULL, error))
         return NULL;
 
-    contents_v = nm_utils_strsplit_set(contents, "\n\r");
+    contents_v = nm_strsplit_set(contents, "\n\r");
     for (i = 0; contents_v && contents_v[i]; i++) {
         const char *p = nm_str_skip_leading_spaces(contents_v[i]);
         GBytes *    duid;
@@ -671,7 +671,7 @@ nm_dhcp_dhclient_save_duid(const char *leasefile, GBytes *duid, GError **error)
             return FALSE;
         }
 
-        lines = nm_utils_strsplit_set_with_empty(contents, "\n\r");
+        lines = nm_strsplit_set_with_empty(contents, "\n\r");
     }
 
     s = g_string_sized_new(len + 50);
diff --git a/src/core/dhcp/nm-dhcp-dhclient.c b/src/core/dhcp/nm-dhcp-dhclient.c
index 4a11250f..970a51f5 100644
--- a/src/core/dhcp/nm-dhcp-dhclient.c
+++ b/src/core/dhcp/nm-dhcp-dhclient.c
@@ -14,21 +14,21 @@
 
 #if WITH_DHCLIENT
 
-    #include <stdlib.h>
-    #include <unistd.h>
-    #include <stdio.h>
-    #include <netinet/in.h>
-    #include <arpa/inet.h>
-    #include <ctype.h>
-
-    #include "libnm-glib-aux/nm-dedup-multi.h"
-
-    #include "nm-utils.h"
-    #include "nm-dhcp-dhclient-utils.h"
-    #include "nm-dhcp-manager.h"
-    #include "NetworkManagerUtils.h"
-    #include "nm-dhcp-listener.h"
-    #include "nm-dhcp-client-logging.h"
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <ctype.h>
+
+#include "libnm-glib-aux/nm-dedup-multi.h"
+
+#include "nm-utils.h"
+#include "nm-dhcp-dhclient-utils.h"
+#include "nm-dhcp-manager.h"
+#include "NetworkManagerUtils.h"
+#include "nm-dhcp-listener.h"
+#include "nm-dhcp-client-logging.h"
 
 /*****************************************************************************/
 
@@ -41,16 +41,15 @@ _addr_family_to_path_part(int addr_family)
 
 /*****************************************************************************/
 
-    #define NM_TYPE_DHCP_DHCLIENT (nm_dhcp_dhclient_get_type())
-    #define NM_DHCP_DHCLIENT(obj) \
-        (G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_DHCP_DHCLIENT, NMDhcpDhclient))
-    #define NM_DHCP_DHCLIENT_CLASS(klass) \
-        (G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_DHCP_DHCLIENT, NMDhcpDhclientClass))
-    #define NM_IS_DHCP_DHCLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NM_TYPE_DHCP_DHCLIENT))
-    #define NM_IS_DHCP_DHCLIENT_CLASS(klass) \
-        (G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_DHCP_DHCLIENT))
-    #define NM_DHCP_DHCLIENT_GET_CLASS(obj) \
-        (G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_DHCP_DHCLIENT, NMDhcpDhclientClass))
+#define NM_TYPE_DHCP_DHCLIENT (nm_dhcp_dhclient_get_type())
+#define NM_DHCP_DHCLIENT(obj) \
+    (G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_DHCP_DHCLIENT, NMDhcpDhclient))
+#define NM_DHCP_DHCLIENT_CLASS(klass) \
+    (G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_DHCP_DHCLIENT, NMDhcpDhclientClass))
+#define NM_IS_DHCP_DHCLIENT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), NM_TYPE_DHCP_DHCLIENT))
+#define NM_IS_DHCP_DHCLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_DHCP_DHCLIENT))
+#define NM_DHCP_DHCLIENT_GET_CLASS(obj) \
+    (G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_DHCP_DHCLIENT, NMDhcpDhclientClass))
 
 typedef struct _NMDhcpDhclient      NMDhcpDhclient;
 typedef struct _NMDhcpDhclientClass NMDhcpDhclientClass;
@@ -78,8 +77,8 @@ struct _NMDhcpDhclientClass {
 
 G_DEFINE_TYPE(NMDhcpDhclient, nm_dhcp_dhclient, NM_TYPE_DHCP_CLIENT)
 
-    #define NM_DHCP_DHCLIENT_GET_PRIVATE(self) \
-        _NM_GET_PRIVATE(self, NMDhcpDhclient, NM_IS_DHCP_DHCLIENT)
+#define NM_DHCP_DHCLIENT_GET_PRIVATE(self) \
+    _NM_GET_PRIVATE(self, NMDhcpDhclient, NM_IS_DHCP_DHCLIENT)
 
 /*****************************************************************************/
 
@@ -731,9 +730,10 @@ nm_dhcp_dhclient_class_init(NMDhcpDhclientClass *dhclient_class)
 }
 
 const NMDhcpClientFactory _nm_dhcp_client_factory_dhclient = {
-    .name     = "dhclient",
-    .get_type = nm_dhcp_dhclient_get_type,
-    .get_path = nm_dhcp_dhclient_get_path,
+    .name       = "dhclient",
+    .get_type_4 = nm_dhcp_dhclient_get_type,
+    .get_type_6 = nm_dhcp_dhclient_get_type,
+    .get_path   = nm_dhcp_dhclient_get_path,
 };
 
 #endif /* WITH_DHCLIENT */
diff --git a/src/core/dhcp/nm-dhcp-dhcpcanon.c b/src/core/dhcp/nm-dhcp-dhcpcanon.c
index f3a52ea9..f993ffb9 100644
--- a/src/core/dhcp/nm-dhcp-dhcpcanon.c
+++ b/src/core/dhcp/nm-dhcp-dhcpcanon.c
@@ -7,25 +7,24 @@
 
 #if WITH_DHCPCANON
 
-    #include <stdlib.h>
-    #include <unistd.h>
-
-    #include "nm-utils.h"
-    #include "nm-dhcp-manager.h"
-    #include "NetworkManagerUtils.h"
-    #include "nm-dhcp-listener.h"
-    #include "nm-dhcp-client-logging.h"
-
-    #define NM_TYPE_DHCP_DHCPCANON (nm_dhcp_dhcpcanon_get_type())
-    #define NM_DHCP_DHCPCANON(obj) \
-        (G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_DHCP_DHCPCANON, NMDhcpDhcpcanon))
-    #define NM_DHCP_DHCPCANON_CLASS(klass) \
-        (G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_DHCP_DHCPCANON, NMDhcpDhcpcanonClass))
-    #define NM_IS_DHCP_DHCPCANON(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NM_TYPE_DHCP_DHCPCANON))
-    #define NM_IS_DHCP_DHCPCANON_CLASS(klass) \
-        (G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_DHCP_DHCPCANON))
-    #define NM_DHCP_DHCPCANON_GET_CLASS(obj) \
-        (G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_DHCP_DHCPCANON, NMDhcpDhcpcanonClass))
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "nm-utils.h"
+#include "nm-dhcp-manager.h"
+#include "NetworkManagerUtils.h"
+#include "nm-dhcp-listener.h"
+#include "nm-dhcp-client-logging.h"
+
+#define NM_TYPE_DHCP_DHCPCANON (nm_dhcp_dhcpcanon_get_type())
+#define NM_DHCP_DHCPCANON(obj) \
+    (G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_DHCP_DHCPCANON, NMDhcpDhcpcanon))
+#define NM_DHCP_DHCPCANON_CLASS(klass) \
+    (G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_DHCP_DHCPCANON, NMDhcpDhcpcanonClass))
+#define NM_IS_DHCP_DHCPCANON(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), NM_TYPE_DHCP_DHCPCANON))
+#define NM_IS_DHCP_DHCPCANON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_DHCP_DHCPCANON))
+#define NM_DHCP_DHCPCANON_GET_CLASS(obj) \
+    (G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_DHCP_DHCPCANON, NMDhcpDhcpcanonClass))
 
 typedef struct _NMDhcpDhcpcanon      NMDhcpDhcpcanon;
 typedef struct _NMDhcpDhcpcanonClass NMDhcpDhcpcanonClass;
@@ -53,8 +52,8 @@ struct _NMDhcpDhcpcanonClass {
 
 G_DEFINE_TYPE(NMDhcpDhcpcanon, nm_dhcp_dhcpcanon, NM_TYPE_DHCP_CLIENT)
 
-    #define NM_DHCP_DHCPCANON_GET_PRIVATE(self) \
-        _NM_GET_PRIVATE(self, NMDhcpDhcpcanon, NM_IS_DHCP_DHCPCANON)
+#define NM_DHCP_DHCPCANON_GET_PRIVATE(self) \
+    _NM_GET_PRIVATE(self, NMDhcpDhcpcanon, NM_IS_DHCP_DHCPCANON)
 
 /*****************************************************************************/
 
@@ -232,9 +231,9 @@ nm_dhcp_dhcpcanon_class_init(NMDhcpDhcpcanonClass *dhcpcanon_class)
 }
 
 const NMDhcpClientFactory _nm_dhcp_client_factory_dhcpcanon = {
-    .name     = "dhcpcanon",
-    .get_type = nm_dhcp_dhcpcanon_get_type,
-    .get_path = nm_dhcp_dhcpcanon_get_path,
+    .name       = "dhcpcanon",
+    .get_type_4 = nm_dhcp_dhcpcanon_get_type,
+    .get_path   = nm_dhcp_dhcpcanon_get_path,
 };
 
 #endif /* WITH_DHCPCANON */
diff --git a/src/core/dhcp/nm-dhcp-dhcpcd.c b/src/core/dhcp/nm-dhcp-dhcpcd.c
index 605fb84d..7522156b 100644
--- a/src/core/dhcp/nm-dhcp-dhcpcd.c
+++ b/src/core/dhcp/nm-dhcp-dhcpcd.c
@@ -8,29 +8,28 @@
 
 #if WITH_DHCPCD
 
-    #include <stdlib.h>
-    #include <unistd.h>
-    #include <stdio.h>
-    #include <netinet/in.h>
-    #include <arpa/inet.h>
-
-    #include "nm-dhcp-manager.h"
-    #include "nm-utils.h"
-    #include "NetworkManagerUtils.h"
-    #include "nm-dhcp-listener.h"
-    #include "nm-dhcp-client-logging.h"
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include "nm-dhcp-manager.h"
+#include "nm-utils.h"
+#include "NetworkManagerUtils.h"
+#include "nm-dhcp-listener.h"
+#include "nm-dhcp-client-logging.h"
 
 /*****************************************************************************/
 
-    #define NM_TYPE_DHCP_DHCPCD (nm_dhcp_dhcpcd_get_type())
-    #define NM_DHCP_DHCPCD(obj) \
-        (G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_DHCP_DHCPCD, NMDhcpDhcpcd))
-    #define NM_DHCP_DHCPCD_CLASS(klass) \
-        (G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_DHCP_DHCPCD, NMDhcpDhcpcdClass))
-    #define NM_IS_DHCP_DHCPCD(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), NM_TYPE_DHCP_DHCPCD))
-    #define NM_IS_DHCP_DHCPCD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_DHCP_DHCPCD))
-    #define NM_DHCP_DHCPCD_GET_CLASS(obj) \
-        (G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_DHCP_DHCPCD, NMDhcpDhcpcdClass))
+#define NM_TYPE_DHCP_DHCPCD (nm_dhcp_dhcpcd_get_type())
+#define NM_DHCP_DHCPCD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_DHCP_DHCPCD, NMDhcpDhcpcd))
+#define NM_DHCP_DHCPCD_CLASS(klass) \
+    (G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_DHCP_DHCPCD, NMDhcpDhcpcdClass))
+#define NM_IS_DHCP_DHCPCD(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), NM_TYPE_DHCP_DHCPCD))
+#define NM_IS_DHCP_DHCPCD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_DHCP_DHCPCD))
+#define NM_DHCP_DHCPCD_GET_CLASS(obj) \
+    (G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_DHCP_DHCPCD, NMDhcpDhcpcdClass))
 
 typedef struct _NMDhcpDhcpcd      NMDhcpDhcpcd;
 typedef struct _NMDhcpDhcpcdClass NMDhcpDhcpcdClass;
@@ -54,7 +53,7 @@ struct _NMDhcpDhcpcdClass {
 
 G_DEFINE_TYPE(NMDhcpDhcpcd, nm_dhcp_dhcpcd, NM_TYPE_DHCP_CLIENT)
 
-    #define NM_DHCP_DHCPCD_GET_PRIVATE(self) _NM_GET_PRIVATE(self, NMDhcpDhcpcd, NM_IS_DHCP_DHCPCD)
+#define NM_DHCP_DHCPCD_GET_PRIVATE(self) _NM_GET_PRIVATE(self, NMDhcpDhcpcd, NM_IS_DHCP_DHCPCD)
 
 /*****************************************************************************/
 
@@ -233,9 +232,9 @@ nm_dhcp_dhcpcd_class_init(NMDhcpDhcpcdClass *dhcpcd_class)
 }
 
 const NMDhcpClientFactory _nm_dhcp_client_factory_dhcpcd = {
-    .name     = "dhcpcd",
-    .get_type = nm_dhcp_dhcpcd_get_type,
-    .get_path = nm_dhcp_dhcpcd_get_path,
+    .name       = "dhcpcd",
+    .get_type_4 = nm_dhcp_dhcpcd_get_type,
+    .get_path   = nm_dhcp_dhcpcd_get_path,
 };
 
 #endif /* WITH_DHCPCD */
diff --git a/src/core/dhcp/nm-dhcp-helper.c b/src/core/dhcp/nm-dhcp-helper.c
index 56d20101..fd666676 100644
--- a/src/core/dhcp/nm-dhcp-helper.c
+++ b/src/core/dhcp/nm-dhcp-helper.c
@@ -16,9 +16,9 @@
 /*****************************************************************************/
 
 #if NM_MORE_LOGGING
-    #define _NMLOG_ENABLED(level) TRUE
+#define _NMLOG_ENABLED(level) TRUE
 #else
-    #define _NMLOG_ENABLED(level) ((level) <= LOG_ERR)
+#define _NMLOG_ENABLED(level) ((level) <= LOG_ERR)
 #endif
 
 #define _NMLOG(always_enabled, level, ...)                                                       \
diff --git a/src/core/dhcp/nm-dhcp-listener.c b/src/core/dhcp/nm-dhcp-listener.c
index b8bb3c33..ae2c40f1 100644
--- a/src/core/dhcp/nm-dhcp-listener.c
+++ b/src/core/dhcp/nm-dhcp-listener.c
@@ -26,8 +26,9 @@
 /*****************************************************************************/
 
 const NMDhcpClientFactory *const _nm_dhcp_manager_factories[6] = {
+
 /* the order here matters, as we will try the plugins in this order to find
-     * the first available plugin. */
+ * the first available plugin. */
 
 #if WITH_DHCPCANON
     &_nm_dhcp_client_factory_dhcpcanon,
diff --git a/src/core/dhcp/nm-dhcp-manager.c b/src/core/dhcp/nm-dhcp-manager.c
index 44b8ede2..3cb89393 100644
--- a/src/core/dhcp/nm-dhcp-manager.c
+++ b/src/core/dhcp/nm-dhcp-manager.c
@@ -27,7 +27,6 @@
 typedef struct {
     const NMDhcpClientFactory *client_factory;
     char *                     default_hostname;
-    CList                      dhcp_client_lst_head;
 } NMDhcpManagerPrivate;
 
 struct _NMDhcpManager {
@@ -45,14 +44,6 @@ G_DEFINE_TYPE(NMDhcpManager, nm_dhcp_manager, G_TYPE_OBJECT)
 
 /*****************************************************************************/
 
-static void client_state_changed(NMDhcpClient * client,
-                                 NMDhcpState    state,
-                                 GObject *      ip_config,
-                                 GVariant *     options,
-                                 NMDhcpManager *self);
-
-/*****************************************************************************/
-
 /* default to installed helper, but can be modified for testing */
 const char *nm_dhcp_helper_path = LIBEXECDIR "/nm-dhcp-helper";
 
@@ -63,9 +54,9 @@ _client_factory_find_by_name(const char *name)
 {
     int i;
 
-    g_return_val_if_fail(name, NULL);
+    nm_assert(name);
 
-    for (i = 0; i < G_N_ELEMENTS(_nm_dhcp_manager_factories); i++) {
+    for (i = 0; i < (int) G_N_ELEMENTS(_nm_dhcp_manager_factories); i++) {
         const NMDhcpClientFactory *f = _nm_dhcp_manager_factories[i];
 
         if (f && nm_streq(f->name, name))
@@ -85,11 +76,10 @@ _client_factory_available(const NMDhcpClientFactory *client_factory)
 static GType
 _client_factory_get_gtype(const NMDhcpClientFactory *client_factory, int addr_family)
 {
-    GType                    gtype;
-    nm_auto_unref_gtypeclass NMDhcpClientClass *klass = NULL;
+    GType gtype;
+    GType (*get_type_fcn)(void);
 
     nm_assert(client_factory);
-    nm_assert_addr_family(addr_family);
 
     /* currently, the chosen DHCP plugin for IPv4 and IPv6 is configured in NetworkManager.conf
      * and cannot be reloaded. It would be nice to configure the plugin per address family
@@ -111,29 +101,22 @@ _client_factory_get_gtype(const NMDhcpClientFactory *client_factory, int addr_fa
      * to those plugins. But we don't intend to do so. The internal plugin is the way forward and
      * not extending other plugins. */
 
-    if (client_factory->get_type_per_addr_family)
-        gtype = client_factory->get_type_per_addr_family(addr_family);
+    if (NM_IS_IPv4(addr_family))
+        get_type_fcn = client_factory->get_type_4;
     else
-        gtype = client_factory->get_type();
-
-    if (client_factory == &_nm_dhcp_client_factory_internal) {
-        /* we are already using the internal plugin. Nothing to do. */
-        goto out;
+        get_type_fcn = client_factory->get_type_6;
+
+    if (!get_type_fcn) {
+        /* If the factory does not support the address family, we always
+         * fallback to the internal. */
+        if (NM_IS_IPv4(addr_family))
+            get_type_fcn = _nm_dhcp_client_factory_internal.get_type_4;
+        else
+            get_type_fcn = _nm_dhcp_client_factory_internal.get_type_6;
     }
 
-    klass = g_type_class_ref(gtype);
-
-    nm_assert(NM_IS_DHCP_CLIENT_CLASS(klass));
+    gtype = get_type_fcn();
 
-    if (addr_family == AF_INET6) {
-        if (!klass->ip6_start)
-            gtype = _client_factory_get_gtype(&_nm_dhcp_client_factory_internal, addr_family);
-    } else {
-        if (!klass->ip4_start)
-            gtype = _client_factory_get_gtype(&_nm_dhcp_client_factory_internal, addr_family);
-    }
-
-out:
     nm_assert(g_type_is_a(gtype, NM_TYPE_DHCP_CLIENT));
     nm_assert(({
         nm_auto_unref_gtypeclass NMDhcpClientClass *k = g_type_class_ref(gtype);
@@ -147,56 +130,6 @@ out:
 /*****************************************************************************/
 
 static NMDhcpClient *
-get_client_for_ifindex(NMDhcpManager *manager, int addr_family, int ifindex)
-{
-    NMDhcpManagerPrivate *priv;
-    NMDhcpClient *        client;
-
-    g_return_val_if_fail(NM_IS_DHCP_MANAGER(manager), NULL);
-    g_return_val_if_fail(ifindex > 0, NULL);
-
-    priv = NM_DHCP_MANAGER_GET_PRIVATE(manager);
-
-    c_list_for_each_entry (client, &priv->dhcp_client_lst_head, dhcp_client_lst) {
-        if (nm_dhcp_client_get_ifindex(client) == ifindex
-            && nm_dhcp_client_get_addr_family(client) == addr_family)
-            return client;
-    }
-
-    return NULL;
-}
-
-static void
-remove_client(NMDhcpManager *self, NMDhcpClient *client)
-{
-    g_signal_handlers_disconnect_by_func(client, client_state_changed, self);
-    c_list_unlink(&client->dhcp_client_lst);
-
-    /* Stopping the client is left up to the controlling device
-     * explicitly since we may want to quit NetworkManager but not terminate
-     * the DHCP client.
-     */
-}
-
-static void
-remove_client_unref(NMDhcpManager *self, NMDhcpClient *client)
-{
-    remove_client(self, client);
-    g_object_unref(client);
-}
-
-static void
-client_state_changed(NMDhcpClient * client,
-                     NMDhcpState    state,
-                     GObject *      ip_config,
-                     GVariant *     options,
-                     NMDhcpManager *self)
-{
-    if (state >= NM_DHCP_STATE_TIMEOUT)
-        remove_client_unref(self, client);
-}
-
-static NMDhcpClient *
 client_start(NMDhcpManager *           self,
              int                       addr_family,
              NMDedupMultiIndex *       multi_idx,
@@ -226,10 +159,10 @@ client_start(NMDhcpManager *           self,
              GError **                 error)
 {
     NMDhcpManagerPrivate *priv;
-    NMDhcpClient *        client;
-    gboolean              success = FALSE;
-    gsize                 hwaddr_len;
-    GType                 gtype;
+    gs_unref_object NMDhcpClient *client  = NULL;
+    gboolean                      success = FALSE;
+    gsize                         hwaddr_len;
+    GType                         gtype;
 
     g_return_val_if_fail(NM_IS_DHCP_MANAGER(self), NULL);
     g_return_val_if_fail(iface, NULL);
@@ -278,20 +211,6 @@ client_start(NMDhcpManager *           self,
 
     priv = NM_DHCP_MANAGER_GET_PRIVATE(self);
 
-    /* Kill any old client instance */
-    client = get_client_for_ifindex(self, addr_family, ifindex);
-    if (client) {
-        /* FIXME: we cannot just call synchronously "stop()" and forget about the client.
-         * We need to wait for the client to be fully stopped because most/all clients
-         * cannot quit right away.
-         *
-         * FIXME(shutdown): also fix this during shutdown, to wait for all DHCP clients
-         * to be fully stopped. */
-        remove_client(self, client);
-        nm_dhcp_client_stop(client, FALSE);
-        g_object_unref(client);
-    }
-
     gtype = _client_factory_get_gtype(priv->client_factory, addr_family);
 
     nm_log_trace(LOGD_DHCP,
@@ -340,12 +259,6 @@ client_start(NMDhcpManager *           self,
                           NM_DHCP_CLIENT_ANYCAST_ADDRESS,
                           anycast_address,
                           NULL);
-    nm_assert(client && c_list_is_empty(&client->dhcp_client_lst));
-    c_list_link_tail(&priv->dhcp_client_lst_head, &client->dhcp_client_lst);
-    g_signal_connect(client,
-                     NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED,
-                     G_CALLBACK(client_state_changed),
-                     self);
 
     /* unfortunately, our implementations work differently per address-family regarding client-id/DUID.
      *
@@ -385,12 +298,10 @@ client_start(NMDhcpManager *           self,
                                            error);
     }
 
-    if (!success) {
-        remove_client_unref(self, client);
+    if (!success)
         return NULL;
-    }
 
-    return g_object_ref(client);
+    return g_steal_pointer(&client);
 }
 
 /* Caller owns a reference to the NMDhcpClient on return */
@@ -596,9 +507,7 @@ nm_dhcp_manager_init(NMDhcpManager *self)
     int                        i;
     const NMDhcpClientFactory *client_factory = NULL;
 
-    c_list_init(&priv->dhcp_client_lst_head);
-
-    for (i = 0; i < G_N_ELEMENTS(_nm_dhcp_manager_factories); i++) {
+    for (i = 0; i < (int) G_N_ELEMENTS(_nm_dhcp_manager_factories); i++) {
         const NMDhcpClientFactory *f = _nm_dhcp_manager_factories[i];
 
         if (!f)
@@ -608,7 +517,7 @@ nm_dhcp_manager_init(NMDhcpManager *self)
                    "dhcp-init: enabled DHCP client '%s'%s%s",
                    f->name,
                    _client_factory_available(f) ? "" : " (not available)",
-                   f->experimental ? " (undocumented internal plugin)" : "");
+                   f->undocumented ? " (undocumented internal plugin)" : "");
     }
 
     /* Client-specific setup */
@@ -644,7 +553,7 @@ nm_dhcp_manager_init(NMDhcpManager *self)
             }
         }
         if (!client_factory) {
-            for (i = 0; i < G_N_ELEMENTS(_nm_dhcp_manager_factories); i++) {
+            for (i = 0; i < (int) G_N_ELEMENTS(_nm_dhcp_manager_factories); i++) {
                 client_factory = _client_factory_available(_nm_dhcp_manager_factories[i]);
                 if (client_factory)
                     break;
@@ -668,10 +577,6 @@ dispose(GObject *object)
 {
     NMDhcpManager *       self = NM_DHCP_MANAGER(object);
     NMDhcpManagerPrivate *priv = NM_DHCP_MANAGER_GET_PRIVATE(self);
-    NMDhcpClient *        client, *client_safe;
-
-    c_list_for_each_entry_safe (client, client_safe, &priv->dhcp_client_lst_head, dhcp_client_lst)
-        remove_client_unref(self, client);
 
     G_OBJECT_CLASS(nm_dhcp_manager_parent_class)->dispose(object);
 
diff --git a/src/core/dhcp/nm-dhcp-nettools.c b/src/core/dhcp/nm-dhcp-nettools.c
index 4bb6c833..56b485dd 100644
--- a/src/core/dhcp/nm-dhcp-nettools.c
+++ b/src/core/dhcp/nm-dhcp-nettools.c
@@ -601,7 +601,7 @@ lease_to_ip4_config(NMDedupMultiIndex *multi_idx,
         nm_str_buf_append_len0(&sbuf, (const char *) l_data, l_data_len);
 
         /* Multiple domains sometimes stuffed into option 15 "Domain Name". */
-        domains = nm_utils_strsplit_set(nm_str_buf_get_str(&sbuf), " ");
+        domains = nm_strsplit_set(nm_str_buf_get_str(&sbuf), " ");
 
         nm_str_buf_reset(&sbuf);
         if (domains) {
@@ -997,9 +997,7 @@ nettools_create(NMDhcpNettools *self, GError **error)
 
     n_dhcp4_client_get_fd(priv->client, &fd);
 
-    priv->event_source =
-        nm_g_unix_fd_source_new(fd, G_IO_IN, G_PRIORITY_DEFAULT, dhcp4_event_cb, self, NULL);
-    g_source_attach(priv->event_source, NULL);
+    priv->event_source = nm_g_unix_fd_add_source(fd, G_IO_IN, dhcp4_event_cb, self);
 
     return TRUE;
 }
@@ -1221,7 +1219,7 @@ ip4_start(NMDhcpClient *client, const char *last_ip4_address, GError **error)
         return FALSE;
     }
 
-    _LOGT("dhcp-client4: start %p", (gpointer) priv->client);
+    _LOGT("dhcp-client4: start " NM_HASH_OBFUSCATE_PTR_FMT, NM_HASH_OBFUSCATE_PTR(priv->client));
 
     nm_dhcp_client_start_timeout(client);
     return TRUE;
@@ -1235,7 +1233,7 @@ stop(NMDhcpClient *client, gboolean release)
 
     NM_DHCP_CLIENT_CLASS(nm_dhcp_nettools_parent_class)->stop(client, release);
 
-    _LOGT("dhcp-client4: stop %p", (gpointer) priv->client);
+    _LOGT("dhcp-client4: stop " NM_HASH_OBFUSCATE_PTR_FMT, NM_HASH_OBFUSCATE_PTR(priv->client));
 
     priv->probe = n_dhcp4_client_probe_free(priv->probe);
 }
@@ -1276,6 +1274,6 @@ nm_dhcp_nettools_class_init(NMDhcpNettoolsClass *class)
 
 const NMDhcpClientFactory _nm_dhcp_client_factory_nettools = {
     .name         = "nettools",
-    .get_type     = nm_dhcp_nettools_get_type,
-    .experimental = TRUE,
+    .get_type_4   = nm_dhcp_nettools_get_type,
+    .undocumented = TRUE,
 };
diff --git a/src/core/dhcp/nm-dhcp-systemd.c b/src/core/dhcp/nm-dhcp-systemd.c
index c789aaee..af1d2238 100644
--- a/src/core/dhcp/nm-dhcp-systemd.c
+++ b/src/core/dhcp/nm-dhcp-systemd.c
@@ -592,7 +592,7 @@ ip4_start(NMDhcpClient *client, const char *last_ip4_address, GError **error)
         return FALSE;
     }
 
-    _LOGT("dhcp-client4: set %p", sd_client);
+    _LOGT("dhcp-client4: set " NM_HASH_OBFUSCATE_PTR_FMT, NM_HASH_OBFUSCATE_PTR(sd_client));
 
     r = sd_dhcp_client_attach_event(sd_client, NULL, 0);
     if (r < 0) {
@@ -1124,23 +1124,15 @@ nm_dhcp_systemd_class_init(NMDhcpSystemdClass *sdhcp_class)
 
 const NMDhcpClientFactory _nm_dhcp_client_factory_systemd = {
     .name         = "systemd",
-    .get_type     = nm_dhcp_systemd_get_type,
-    .experimental = TRUE,
+    .get_type_4   = nm_dhcp_systemd_get_type,
+    .get_type_6   = nm_dhcp_systemd_get_type,
+    .undocumented = TRUE,
 };
 
 /*****************************************************************************/
 
-static GType
-_get_type_per_addr_family(int addr_family)
-{
-    nm_assert_addr_family(addr_family);
-
-    if (addr_family == AF_INET)
-        return nm_dhcp_nettools_get_type();
-    return nm_dhcp_systemd_get_type();
-}
-
 const NMDhcpClientFactory _nm_dhcp_client_factory_internal = {
-    .name                     = "internal",
-    .get_type_per_addr_family = _get_type_per_addr_family,
+    .name       = "internal",
+    .get_type_4 = nm_dhcp_nettools_get_type,
+    .get_type_6 = nm_dhcp_systemd_get_type,
 };
diff --git a/src/core/dhcp/nm-dhcp-utils.c b/src/core/dhcp/nm-dhcp-utils.c
index 7fd18b0a..3cc6987a 100644
--- a/src/core/dhcp/nm-dhcp-utils.c
+++ b/src/core/dhcp/nm-dhcp-utils.c
@@ -35,7 +35,7 @@ ip4_process_dhcpcd_rfc3442_routes(const char * iface,
     const char **        r;
     gboolean             have_routes = FALSE;
 
-    routes = nm_utils_strsplit_set(str, " ");
+    routes = nm_strsplit_set(str, " ");
     if (!routes)
         return FALSE;
 
@@ -164,7 +164,7 @@ ip4_process_dhclient_rfc3442_routes(const char * iface,
     const char *const *  o;
     gboolean             have_routes = FALSE;
 
-    octets = nm_utils_strsplit_set_with_empty(str, " .");
+    octets = nm_strsplit_set_with_empty(str, " .");
     if (NM_PTRARRAY_LEN(octets) < 5) {
         _LOG2W(LOGD_DHCP4, iface, "ignoring invalid classless static routes '%s'", str);
         return FALSE;
@@ -296,7 +296,7 @@ process_classful_routes(const char * iface,
     if (!str)
         return;
 
-    searches = nm_utils_strsplit_set(str, " ");
+    searches = nm_strsplit_set(str, " ");
     if (!searches)
         return;
 
@@ -376,7 +376,7 @@ process_domain_search(const char *iface, const char *str, GFunc add_func, gpoint
         return;
     }
 
-    searches = nm_utils_strsplit_set(unescaped, " ");
+    searches = nm_strsplit_set(unescaped, " ");
     for (s = searches; searches && *s; s++) {
         _LOG2I(LOGD_DHCP, iface, "  domain search '%s'", *s);
         add_func((gpointer) *s, user_data);
@@ -450,7 +450,7 @@ nm_dhcp_utils_ip4_config_from_options(NMDedupMultiIndex *multi_idx,
          */
         str = g_hash_table_lookup(options, "routers");
         if (str) {
-            gs_free const char **routers = nm_utils_strsplit_set(str, " ");
+            gs_free const char **routers = nm_strsplit_set(str, " ");
             const char **        s;
 
             for (s = routers; routers && *s; s++) {
@@ -491,7 +491,7 @@ nm_dhcp_utils_ip4_config_from_options(NMDedupMultiIndex *multi_idx,
 
     str = g_hash_table_lookup(options, "domain_name_servers");
     if (str) {
-        gs_free const char **dns = nm_utils_strsplit_set(str, " ");
+        gs_free const char **dns = nm_strsplit_set(str, " ");
         const char **        s;
 
         for (s = dns; dns && *s; s++) {
@@ -507,7 +507,7 @@ nm_dhcp_utils_ip4_config_from_options(NMDedupMultiIndex *multi_idx,
 
     str = g_hash_table_lookup(options, "domain_name");
     if (str) {
-        gs_free const char **domains = nm_utils_strsplit_set(str, " ");
+        gs_free const char **domains = nm_strsplit_set(str, " ");
         const char **        s;
 
         for (s = domains; domains && *s; s++) {
@@ -522,7 +522,7 @@ nm_dhcp_utils_ip4_config_from_options(NMDedupMultiIndex *multi_idx,
 
     str = g_hash_table_lookup(options, "netbios_name_servers");
     if (str) {
-        gs_free const char **nbns = nm_utils_strsplit_set(str, " ");
+        gs_free const char **nbns = nm_strsplit_set(str, " ");
         const char **        s;
 
         for (s = nbns; nbns && *s; s++) {
@@ -557,7 +557,7 @@ nm_dhcp_utils_ip4_config_from_options(NMDedupMultiIndex *multi_idx,
 
     str = g_hash_table_lookup(options, "nis_servers");
     if (str) {
-        gs_free const char **nis = nm_utils_strsplit_set(str, " ");
+        gs_free const char **nis = nm_strsplit_set(str, " ");
         const char **        s;
 
         for (s = nis; nis && *s; s++) {
@@ -689,7 +689,7 @@ nm_dhcp_utils_ip6_config_from_options(NMDedupMultiIndex *multi_idx,
 
     str = g_hash_table_lookup(options, "dhcp6_name_servers");
     if (str) {
-        gs_free const char **dns = nm_utils_strsplit_set(str, " ");
+        gs_free const char **dns = nm_strsplit_set(str, " ");
         const char **        s;
 
         for (s = dns; dns && *s; s++) {
diff --git a/src/core/dhcp/tests/test-dhcp-dhclient.c b/src/core/dhcp/tests/test-dhcp-dhclient.c
index e9a62096..9c6865cc 100644
--- a/src/core/dhcp/tests/test-dhcp-dhclient.c
+++ b/src/core/dhcp/tests/test-dhcp-dhclient.c
@@ -830,7 +830,7 @@ test_one_duid(const char *escaped, const guint8 *unescaped, guint len)
 
     t1 = nm_dhcp_dhclient_unescape_duid(escaped);
     g_assert(t1);
-    g_assert(nm_utils_gbytes_equal_mem(t1, unescaped, len));
+    g_assert(nm_g_bytes_equal_mem(t1, unescaped, len));
 
     t2 = g_bytes_new(unescaped, len);
     w  = nm_dhcp_dhclient_escape_duid(t2);
@@ -879,7 +879,7 @@ test_read_duid_from_leasefile(void)
     duid = nm_dhcp_dhclient_read_duid(TEST_DIR "/test-dhclient-duid.leases", &error);
     nmtst_assert_success(duid, error);
 
-    g_assert(nm_utils_gbytes_equal_mem(duid, expected, G_N_ELEMENTS(expected)));
+    g_assert(nm_g_bytes_equal_mem(duid, expected, G_N_ELEMENTS(expected)));
 }
 
 static void