summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2014-10-29 17:12:46 -0500
committerDan Williams <dcbw@redhat.com>2014-11-07 12:18:32 -0600
commit318a8c2d727bee5c401f2d6b7f28f706ecb4dfb2 (patch)
tree39c7462577f64ab15510f744d34b4f0d7084945e
parent0b98dc4387c52616aa39979ce61848e6ca8b06b7 (diff)
downloadNetworkManager-318a8c2d727bee5c401f2d6b7f28f706ecb4dfb2.tar.gz
dhcp: move client-specific knowledge out of the manager
-rw-r--r--src/Makefile.am22
-rw-r--r--src/dhcp-manager/nm-dhcp-client.h11
-rw-r--r--src/dhcp-manager/nm-dhcp-dhclient.c14
-rw-r--r--src/dhcp-manager/nm-dhcp-dhclient.h6
-rw-r--r--src/dhcp-manager/nm-dhcp-dhcpcd.c12
-rw-r--r--src/dhcp-manager/nm-dhcp-dhcpcd.h2
-rw-r--r--src/dhcp-manager/nm-dhcp-manager.c149
-rw-r--r--src/dhcp-manager/nm-dhcp-systemd.c12
-rw-r--r--src/dhcp-manager/nm-dhcp-systemd.h4
-rw-r--r--src/dhcp-manager/tests/Makefile.am2
10 files changed, 154 insertions, 80 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 92c8b58cf7..e186632548 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -124,6 +124,7 @@ sbin_PROGRAMS = NetworkManager
NetworkManager_SOURCES = \
$(nm_device_sources) $(nm_device_headers) \
+ $(nm_dhcp_client_sources) $(nm_dhcp_client_headers) \
main-utils.c \
main-utils.h \
main.c
@@ -155,8 +156,21 @@ nm_device_headers = \
devices/nm-device-vlan.h \
devices/nm-device-vxlan.h
+nm_dhcp_client_sources = \
+ dhcp-manager/nm-dhcp-dhclient.c \
+ dhcp-manager/nm-dhcp-dhclient-utils.c \
+ dhcp-manager/nm-dhcp-dhcpcd.c \
+ dhcp-manager/nm-dhcp-systemd.c
+
+nm_dhcp_client_headers = \
+ dhcp-manager/nm-dhcp-dhclient.h \
+ dhcp-manager/nm-dhcp-dhclient-utils.h \
+ dhcp-manager/nm-dhcp-dhcpcd.h \
+ dhcp-manager/nm-dhcp-systemd.h
+
nm_sources = \
$(nm_device_headers) \
+ $(nm_dhcp_client_headers) \
devices/nm-device.c \
devices/nm-device.h \
devices/nm-device-ethernet-utils.c \
@@ -174,14 +188,6 @@ nm_sources = \
dhcp-manager/nm-dhcp-utils.h \
dhcp-manager/nm-dhcp-listener.c \
dhcp-manager/nm-dhcp-listener.h \
- dhcp-manager/nm-dhcp-dhclient.c \
- dhcp-manager/nm-dhcp-dhclient.h \
- dhcp-manager/nm-dhcp-dhclient-utils.c \
- dhcp-manager/nm-dhcp-dhclient-utils.h \
- dhcp-manager/nm-dhcp-dhcpcd.c \
- dhcp-manager/nm-dhcp-dhcpcd.h \
- dhcp-manager/nm-dhcp-systemd.h \
- dhcp-manager/nm-dhcp-systemd.c \
dhcp-manager/nm-dhcp-manager.c \
dhcp-manager/nm-dhcp-manager.h \
\
diff --git a/src/dhcp-manager/nm-dhcp-client.h b/src/dhcp-manager/nm-dhcp-client.h
index ca0fdd391b..a9ce9bec37 100644
--- a/src/dhcp-manager/nm-dhcp-client.h
+++ b/src/dhcp-manager/nm-dhcp-client.h
@@ -99,6 +99,17 @@ typedef struct {
GType nm_dhcp_client_get_type (void);
+typedef const char *(*NMDhcpClientGetPathFunc) (void);
+
+typedef GSList * (*NMDhcpClientGetLeaseConfigsFunc) (const char *iface,
+ const char *uuid,
+ gboolean ipv6);
+
+void _nm_dhcp_client_register (GType gtype,
+ const char *name,
+ NMDhcpClientGetPathFunc get_path_func,
+ NMDhcpClientGetLeaseConfigsFunc get_lease_configs_func);
+
pid_t nm_dhcp_client_get_pid (NMDhcpClient *self);
const char *nm_dhcp_client_get_iface (NMDhcpClient *self);
diff --git a/src/dhcp-manager/nm-dhcp-dhclient.c b/src/dhcp-manager/nm-dhcp-dhclient.c
index 58da218150..8f1718f8a6 100644
--- a/src/dhcp-manager/nm-dhcp-dhclient.c
+++ b/src/dhcp-manager/nm-dhcp-dhclient.c
@@ -56,7 +56,7 @@ typedef struct {
char *pid_file;
} NMDhcpDhclientPrivate;
-const char *
+static const char *
nm_dhcp_dhclient_get_path (void)
{
const char *path = NULL;
@@ -123,7 +123,7 @@ get_dhclient_leasefile (const char *iface,
return NULL;
}
-GSList *
+static GSList *
nm_dhcp_dhclient_get_lease_ip_configs (const char *iface,
const char *uuid,
gboolean ipv6)
@@ -653,3 +653,13 @@ nm_dhcp_dhclient_class_init (NMDhcpDhclientClass *dhclient_class)
client_class->get_duid = get_duid;
}
+static void __attribute__((constructor))
+register_dhcp_dhclient (void)
+{
+ g_type_init ();
+ _nm_dhcp_client_register (NM_TYPE_DHCP_DHCLIENT,
+ "dhclient",
+ nm_dhcp_dhclient_get_path,
+ nm_dhcp_dhclient_get_lease_ip_configs);
+}
+
diff --git a/src/dhcp-manager/nm-dhcp-dhclient.h b/src/dhcp-manager/nm-dhcp-dhclient.h
index 6c58826241..5abcc08ee3 100644
--- a/src/dhcp-manager/nm-dhcp-dhclient.h
+++ b/src/dhcp-manager/nm-dhcp-dhclient.h
@@ -41,11 +41,5 @@ typedef struct {
GType nm_dhcp_dhclient_get_type (void);
-GSList *nm_dhcp_dhclient_get_lease_ip_configs (const char *iface,
- const char *uuid,
- gboolean ipv6);
-
-const char *nm_dhcp_dhclient_get_path (void);
-
#endif /* __NETWORKMANAGER_DHCP_DHCLIENT_H__ */
diff --git a/src/dhcp-manager/nm-dhcp-dhcpcd.c b/src/dhcp-manager/nm-dhcp-dhcpcd.c
index 0313462d7e..c4d91b1247 100644
--- a/src/dhcp-manager/nm-dhcp-dhcpcd.c
+++ b/src/dhcp-manager/nm-dhcp-dhcpcd.c
@@ -48,7 +48,7 @@ typedef struct {
char *pid_file;
} NMDhcpDhcpcdPrivate;
-const char *
+static const char *
nm_dhcp_dhcpcd_get_path (void)
{
const char *path = NULL;
@@ -227,3 +227,13 @@ nm_dhcp_dhcpcd_class_init (NMDhcpDhcpcdClass *dhcpcd_class)
client_class->stop = stop;
}
+static void __attribute__((constructor))
+register_dhcp_dhclient (void)
+{
+ g_type_init ();
+ _nm_dhcp_client_register (NM_TYPE_DHCP_DHCPCD,
+ "dhcpcd",
+ nm_dhcp_dhcpcd_get_path,
+ NULL);
+}
+
diff --git a/src/dhcp-manager/nm-dhcp-dhcpcd.h b/src/dhcp-manager/nm-dhcp-dhcpcd.h
index 4e3502ab5a..deed70e0f9 100644
--- a/src/dhcp-manager/nm-dhcp-dhcpcd.h
+++ b/src/dhcp-manager/nm-dhcp-dhcpcd.h
@@ -41,7 +41,5 @@ typedef struct {
GType nm_dhcp_dhcpcd_get_type (void);
-const char *nm_dhcp_dhcpcd_get_path (void);
-
#endif /* __NETWORKMANAGER_DHCP_DHCPCD_H__ */
diff --git a/src/dhcp-manager/nm-dhcp-manager.c b/src/dhcp-manager/nm-dhcp-manager.c
index beb9c94c65..dbc0684dbc 100644
--- a/src/dhcp-manager/nm-dhcp-manager.c
+++ b/src/dhcp-manager/nm-dhcp-manager.c
@@ -52,7 +52,6 @@ typedef GSList * (*GetLeaseConfigFunc) (const char *iface, const char *uuid, gbo
typedef struct {
GType client_type;
- GetLeaseConfigFunc get_lease_ip_configs_func;
GHashTable * clients;
char * default_hostname;
} NMDhcpManagerPrivate;
@@ -63,6 +62,79 @@ G_DEFINE_TYPE (NMDhcpManager, nm_dhcp_manager, G_TYPE_OBJECT)
/***************************************************/
+typedef struct {
+ GType gtype;
+ const char *name;
+ NMDhcpClientGetPathFunc get_path_func;
+ NMDhcpClientGetLeaseConfigsFunc get_lease_configs_func;
+} ClientDesc;
+
+static GSList *client_descs = NULL;
+
+void
+_nm_dhcp_client_register (GType gtype,
+ const char *name,
+ NMDhcpClientGetPathFunc get_path_func,
+ NMDhcpClientGetLeaseConfigsFunc get_lease_configs_func)
+{
+ ClientDesc *desc;
+ GSList *iter;
+
+ g_return_if_fail (gtype != G_TYPE_INVALID);
+ g_return_if_fail (name != NULL);
+
+ for (iter = client_descs; iter; iter = iter->next) {
+ desc = iter->data;
+ g_return_if_fail (desc->gtype != gtype);
+ g_return_if_fail (strcmp (desc->name, name) != 0);
+ }
+
+ desc = g_slice_new0 (ClientDesc);
+ desc->gtype = gtype;
+ desc->name = name;
+ desc->get_path_func = get_path_func;
+ desc->get_lease_configs_func = get_lease_configs_func;
+ client_descs = g_slist_prepend (client_descs, desc);
+
+ nm_log_info (LOGD_DHCP, "Registered DHCP client '%s'", name);
+}
+
+static ClientDesc *
+find_client_desc (const char *name, GType gtype)
+{
+ GSList *iter;
+
+ g_return_val_if_fail (name || gtype, NULL);
+
+ for (iter = client_descs; iter; iter = iter->next) {
+ ClientDesc *desc = iter->data;
+
+ if (name && strcmp (desc->name, name) != 0)
+ continue;
+ if (gtype && desc->name != 0)
+ continue;
+ return desc;
+ }
+ return NULL;
+}
+
+static GType
+is_client_enabled (const char *name, GError **error)
+{
+ ClientDesc *desc;
+
+ desc = find_client_desc (name, G_TYPE_INVALID);
+ if (desc && (!desc->get_path_func || desc->get_path_func()))
+ return desc->gtype;
+
+ g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
+ _("'%s' support not found or not enabled."),
+ name);
+ return G_TYPE_INVALID;
+}
+
+/***************************************************/
+
static NMDhcpClient *
get_client_for_ifindex (NMDhcpManager *manager, int ifindex, gboolean ip6)
{
@@ -90,52 +162,23 @@ get_client_for_ifindex (NMDhcpManager *manager, int ifindex, gboolean ip6)
static GType
get_client_type (const char *client, GError **error)
{
- gboolean use_dhclient, use_dhcpcd;
-
- /* If a client was disabled at build-time, these will return FALSE */
- use_dhclient = !!nm_dhcp_dhclient_get_path ();
- use_dhcpcd = !!nm_dhcp_dhcpcd_get_path ();
-
- if (!client) {
- if (use_dhclient)
- return NM_TYPE_DHCP_DHCLIENT;
- else if (use_dhcpcd)
- return NM_TYPE_DHCP_DHCPCD;
- else {
- g_set_error_literal (error,
- NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
- _("no usable DHCP client could be found."));
- return G_TYPE_INVALID;
- }
- }
-
- if (!strcmp (client, "dhclient")) {
- if (!use_dhclient) {
- g_set_error_literal (error,
- NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
- _("'dhclient' could not be found or was disabled."));
- return G_TYPE_INVALID;
+ GType client_gtype;
+
+ if (client)
+ client_gtype = is_client_enabled (client, error);
+ else {
+ /* Fallbacks */
+ client_gtype = is_client_enabled ("dhclient", NULL);
+ if (client_gtype == G_TYPE_INVALID)
+ client_gtype = is_client_enabled ("dhcpcd", NULL);
+ if (client_gtype == G_TYPE_INVALID)
+ client_gtype = is_client_enabled ("internal", NULL);
+ if (client_gtype == G_TYPE_INVALID) {
+ g_set_error_literal (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
+ _("no usable DHCP client could be found."));
}
- return NM_TYPE_DHCP_DHCLIENT;
}
-
- if (!strcmp (client, "dhcpcd")) {
- if (!use_dhcpcd) {
- g_set_error_literal (error,
- NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
- _("'dhcpcd' could not be found or was disabled."));
- return G_TYPE_INVALID;
- }
- return NM_TYPE_DHCP_DHCPCD;
- }
-
- if (!strcmp (client, "internal"))
- return NM_TYPE_DHCP_SYSTEMD;
-
- g_set_error (error,
- NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
- _("unsupported DHCP client '%s'"), client);
- return G_TYPE_INVALID;
+ return client_gtype;
}
static void client_state_changed (NMDhcpClient *client,
@@ -312,16 +355,15 @@ nm_dhcp_manager_get_lease_ip_configs (NMDhcpManager *self,
const char *uuid,
gboolean ipv6)
{
- NMDhcpManagerPrivate *priv;
+ ClientDesc *desc;
g_return_val_if_fail (NM_IS_DHCP_MANAGER (self), NULL);
g_return_val_if_fail (iface != NULL, NULL);
g_return_val_if_fail (uuid != NULL, NULL);
- priv = NM_DHCP_MANAGER_GET_PRIVATE (self);
-
- if (priv->get_lease_ip_configs_func)
- return priv->get_lease_ip_configs_func (iface, uuid, ipv6);
+ desc = find_client_desc (NULL, NM_DHCP_MANAGER_GET_PRIVATE (self)->client_type);
+ if (desc && desc->get_lease_configs_func)
+ return desc->get_lease_configs_func (iface, uuid, ipv6);
return NULL;
}
@@ -348,12 +390,7 @@ nm_dhcp_manager_init (NMDhcpManager *self)
/* Client-specific setup */
client = nm_config_get_dhcp_client (nm_config_get ());
priv->client_type = get_client_type (client, &error);
-
- if (priv->client_type == NM_TYPE_DHCP_DHCLIENT)
- priv->get_lease_ip_configs_func = nm_dhcp_dhclient_get_lease_ip_configs;
- else if (priv->client_type == NM_TYPE_DHCP_SYSTEMD)
- priv->get_lease_ip_configs_func = nm_dhcp_systemd_get_lease_ip_configs;
- else if (priv->client_type == G_TYPE_INVALID) {
+ if (priv->client_type == G_TYPE_INVALID) {
nm_log_warn (LOGD_DHCP, "No usable DHCP client found (%s)! DHCP configurations will fail.",
error->message);
}
diff --git a/src/dhcp-manager/nm-dhcp-systemd.c b/src/dhcp-manager/nm-dhcp-systemd.c
index 18b7b32180..6b06c45288 100644
--- a/src/dhcp-manager/nm-dhcp-systemd.c
+++ b/src/dhcp-manager/nm-dhcp-systemd.c
@@ -374,7 +374,7 @@ get_leasefile_path (const char *iface, const char *uuid, gboolean ipv6)
iface);
}
-GSList *
+static GSList *
nm_dhcp_systemd_get_lease_ip_configs (const char *iface,
const char *uuid,
gboolean ipv6)
@@ -808,3 +808,13 @@ nm_dhcp_systemd_class_init (NMDhcpSystemdClass *sdhcp_class)
client_class->stop = stop;
}
+static void __attribute__((constructor))
+register_dhcp_dhclient (void)
+{
+ g_type_init ();
+ _nm_dhcp_client_register (NM_TYPE_DHCP_SYSTEMD,
+ "internal",
+ NULL,
+ nm_dhcp_systemd_get_lease_ip_configs);
+}
+
diff --git a/src/dhcp-manager/nm-dhcp-systemd.h b/src/dhcp-manager/nm-dhcp-systemd.h
index 05e8e8da33..2a7a463eb5 100644
--- a/src/dhcp-manager/nm-dhcp-systemd.h
+++ b/src/dhcp-manager/nm-dhcp-systemd.h
@@ -41,9 +41,5 @@ typedef struct {
GType nm_dhcp_systemd_get_type (void);
-GSList *nm_dhcp_systemd_get_lease_ip_configs (const char *iface,
- const char *uuid,
- gboolean ipv6);
-
#endif /* NM_DHCP_SYSTEMD_H */
diff --git a/src/dhcp-manager/tests/Makefile.am b/src/dhcp-manager/tests/Makefile.am
index 0292db2b7a..1eb02d6323 100644
--- a/src/dhcp-manager/tests/Makefile.am
+++ b/src/dhcp-manager/tests/Makefile.am
@@ -18,6 +18,8 @@ noinst_PROGRAMS = \
####### dhclient leases test #######
test_dhcp_dhclient_SOURCES = \
+ $(top_srcdir)/src/dhcp-manager/nm-dhcp-dhclient-utils.h \
+ $(top_srcdir)/src/dhcp-manager/nm-dhcp-dhclient-utils.c \
test-dhcp-dhclient.c
test_dhcp_dhclient_LDADD = \