diff options
author | Dan Williams <dcbw@redhat.com> | 2014-10-29 17:12:46 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2014-11-07 12:18:32 -0600 |
commit | 318a8c2d727bee5c401f2d6b7f28f706ecb4dfb2 (patch) | |
tree | 39c7462577f64ab15510f744d34b4f0d7084945e | |
parent | 0b98dc4387c52616aa39979ce61848e6ca8b06b7 (diff) | |
download | NetworkManager-318a8c2d727bee5c401f2d6b7f28f706ecb4dfb2.tar.gz |
dhcp: move client-specific knowledge out of the manager
-rw-r--r-- | src/Makefile.am | 22 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-client.h | 11 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-dhclient.c | 14 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-dhclient.h | 6 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-dhcpcd.c | 12 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-dhcpcd.h | 2 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-manager.c | 149 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-systemd.c | 12 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-systemd.h | 4 | ||||
-rw-r--r-- | src/dhcp-manager/tests/Makefile.am | 2 |
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 = \ |