From d14ffbdb9c2713f151d5c4510fe421246da80344 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 10 Mar 2014 16:11:21 +0100 Subject: [PATCH 1/4] dhcp: refactor dhcp code to use @dhcp_anycast_addr as #GByteArray type At a later point, we will have to make a copy of @dhcp_anycast_addr to start the client asynchronously. Although the length of the guint8 array *should* always be 6 byte (being a MAC address), it's nicer to just pass on the GByteArray instance instead, which knows how many byte are actually set. Signed-off-by: Thomas Haller --- src/devices/nm-device.c | 12 ++---------- src/dhcp-manager/nm-dhcp-client.c | 4 ++-- src/dhcp-manager/nm-dhcp-client.h | 8 ++++---- src/dhcp-manager/nm-dhcp-dhclient-utils.c | 15 ++++++++++----- src/dhcp-manager/nm-dhcp-dhclient-utils.h | 2 +- src/dhcp-manager/nm-dhcp-dhclient.c | 8 ++++---- src/dhcp-manager/nm-dhcp-dhcpcd.c | 4 ++-- src/dhcp-manager/nm-dhcp-manager.c | 6 +++--- src/dhcp-manager/nm-dhcp-manager.h | 4 ++-- src/dhcp-manager/tests/test-dhcp-dhclient.c | 2 +- 10 files changed, 31 insertions(+), 34 deletions(-) diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index b6e5a20203..545f86c87a 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -2774,14 +2774,10 @@ dhcp4_start (NMDevice *self, { NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); NMSettingIP4Config *s_ip4; - guint8 *anycast = NULL; GByteArray *tmp = NULL; s_ip4 = nm_connection_get_setting_ip4_config (connection); - if (priv->dhcp_anycast_address) - anycast = priv->dhcp_anycast_address->data; - /* Clear old exported DHCP options */ if (priv->dhcp4_config) g_object_unref (priv->dhcp4_config); @@ -2800,7 +2796,7 @@ dhcp4_start (NMDevice *self, nm_connection_get_uuid (connection), s_ip4, priv->dhcp_timeout, - anycast); + priv->dhcp_anycast_address); if (tmp) g_byte_array_free (tmp, TRUE); @@ -3206,7 +3202,6 @@ dhcp6_start (NMDevice *self, { NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); NMActStageReturn ret = NM_ACT_STAGE_RETURN_FAILURE; - guint8 *anycast = NULL; GByteArray *tmp = NULL; if (!connection) { @@ -3216,9 +3211,6 @@ dhcp6_start (NMDevice *self, /* Begin a DHCP transaction on the interface */ - if (priv->dhcp_anycast_address) - anycast = priv->dhcp_anycast_address->data; - /* Clear old exported DHCP options */ if (priv->dhcp6_config) g_object_unref (priv->dhcp6_config); @@ -3241,7 +3233,7 @@ dhcp6_start (NMDevice *self, nm_connection_get_uuid (connection), nm_connection_get_setting_ip6_config (connection), priv->dhcp_timeout, - anycast, + priv->dhcp_anycast_address, (dhcp_opt == NM_RDISC_DHCP_LEVEL_OTHERCONF) ? TRUE : FALSE); if (tmp) g_byte_array_free (tmp, TRUE); diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c index 3a056d3726..a765f125bb 100644 --- a/src/dhcp-manager/nm-dhcp-client.c +++ b/src/dhcp-manager/nm-dhcp-client.c @@ -296,7 +296,7 @@ start_monitor (NMDHCPClient *self) gboolean nm_dhcp_client_start_ip4 (NMDHCPClient *self, NMSettingIP4Config *s_ip4, - guint8 *dhcp_anycast_addr, + GByteArray *dhcp_anycast_addr, const char *hostname) { NMDHCPClientPrivate *priv; @@ -450,7 +450,7 @@ get_duid (NMDHCPClient *self) gboolean nm_dhcp_client_start_ip6 (NMDHCPClient *self, NMSettingIP6Config *s_ip6, - guint8 *dhcp_anycast_addr, + GByteArray *dhcp_anycast_addr, const char *hostname, gboolean info_only) { diff --git a/src/dhcp-manager/nm-dhcp-client.h b/src/dhcp-manager/nm-dhcp-client.h index 5cc1e39026..4daef103e9 100644 --- a/src/dhcp-manager/nm-dhcp-client.h +++ b/src/dhcp-manager/nm-dhcp-client.h @@ -79,12 +79,12 @@ typedef struct { GPid (*ip4_start) (NMDHCPClient *self, NMSettingIP4Config *s_ip4, - guint8 *anycast_addr, + GByteArray *anycast_addr, const char *hostname); GPid (*ip6_start) (NMDHCPClient *self, NMSettingIP6Config *s_ip6, - guint8 *anycast_addr, + GByteArray *anycast_addr, const char *hostname, gboolean info_only, const GByteArray *duid); @@ -122,12 +122,12 @@ const char *nm_dhcp_client_get_uuid (NMDHCPClient *self); gboolean nm_dhcp_client_start_ip4 (NMDHCPClient *self, NMSettingIP4Config *s_ip4, - guint8 *dhcp_anycast_addr, + GByteArray *dhcp_anycast_addr, const char *hostname); gboolean nm_dhcp_client_start_ip6 (NMDHCPClient *self, NMSettingIP6Config *s_ip6, - guint8 *dhcp_anycast_addr, + GByteArray *dhcp_anycast_addr, const char *hostname, gboolean info_only); diff --git a/src/dhcp-manager/nm-dhcp-dhclient-utils.c b/src/dhcp-manager/nm-dhcp-dhclient-utils.c index fad3a7a8bb..d95eeaeb62 100644 --- a/src/dhcp-manager/nm-dhcp-dhclient-utils.c +++ b/src/dhcp-manager/nm-dhcp-dhclient-utils.c @@ -131,7 +131,7 @@ nm_dhcp_dhclient_create_config (const char *interface, gboolean is_ip6, NMSettingIP4Config *s_ip4, NMSettingIP6Config *s_ip6, - guint8 *anycast_addr, + GByteArray *anycast_addr, const char *hostname, const char *orig_path, const char *orig_contents) @@ -250,17 +250,22 @@ nm_dhcp_dhclient_create_config (const char *interface, g_string_append_c (new_contents, '\n'); - if (anycast_addr) { + if (anycast_addr && anycast_addr->len == 6) { + const guint8 *p_anycast_addr = anycast_addr->data; + g_string_append_printf (new_contents, "interface \"%s\" {\n" " initial-interval 1; \n" " anycast-mac ethernet %02x:%02x:%02x:%02x:%02x:%02x;\n" "}\n", interface, - anycast_addr[0], anycast_addr[1], - anycast_addr[2], anycast_addr[3], - anycast_addr[4], anycast_addr[5]); + p_anycast_addr[0], p_anycast_addr[1], + p_anycast_addr[2], p_anycast_addr[3], + p_anycast_addr[4], p_anycast_addr[5]); } + /* Finally, assert that anycast_addr was unset or a 48 bit mac address. */ + g_return_val_if_fail (!anycast_addr || anycast_addr->len == 6, g_string_free (new_contents, FALSE)); + return g_string_free (new_contents, FALSE); } diff --git a/src/dhcp-manager/nm-dhcp-dhclient-utils.h b/src/dhcp-manager/nm-dhcp-dhclient-utils.h index d2caaa475b..a405d65b2d 100644 --- a/src/dhcp-manager/nm-dhcp-dhclient-utils.h +++ b/src/dhcp-manager/nm-dhcp-dhclient-utils.h @@ -29,7 +29,7 @@ char *nm_dhcp_dhclient_create_config (const char *interface, gboolean is_ip6, NMSettingIP4Config *s_ip4, NMSettingIP6Config *s_ip6, - guint8 *anycast_addr, + GByteArray *anycast_addr, const char *hostname, const char *orig_path, const char *orig_contents); diff --git a/src/dhcp-manager/nm-dhcp-dhclient.c b/src/dhcp-manager/nm-dhcp-dhclient.c index d3677406c8..06ebe8a064 100644 --- a/src/dhcp-manager/nm-dhcp-dhclient.c +++ b/src/dhcp-manager/nm-dhcp-dhclient.c @@ -167,7 +167,7 @@ merge_dhclient_config (const char *iface, gboolean is_ip6, NMSettingIP4Config *s_ip4, NMSettingIP6Config *s_ip6, - guint8 *anycast_addr, + GByteArray *anycast_addr, const char *hostname, const char *orig_path, GError **error) @@ -274,7 +274,7 @@ create_dhclient_config (const char *iface, const char *uuid, NMSettingIP4Config *s_ip4, NMSettingIP6Config *s_ip6, - guint8 *dhcp_anycast_addr, + GByteArray *dhcp_anycast_addr, const char *hostname) { char *orig = NULL, *new = NULL; @@ -476,7 +476,7 @@ dhclient_start (NMDHCPClient *client, static GPid ip4_start (NMDHCPClient *client, NMSettingIP4Config *s_ip4, - guint8 *dhcp_anycast_addr, + GByteArray *dhcp_anycast_addr, const char *hostname) { NMDHCPDhclientPrivate *priv = NM_DHCP_DHCLIENT_GET_PRIVATE (client); @@ -497,7 +497,7 @@ ip4_start (NMDHCPClient *client, static GPid ip6_start (NMDHCPClient *client, NMSettingIP6Config *s_ip6, - guint8 *dhcp_anycast_addr, + GByteArray *dhcp_anycast_addr, const char *hostname, gboolean info_only, const GByteArray *duid) diff --git a/src/dhcp-manager/nm-dhcp-dhcpcd.c b/src/dhcp-manager/nm-dhcp-dhcpcd.c index a62e315f74..1ab32308c4 100644 --- a/src/dhcp-manager/nm-dhcp-dhcpcd.c +++ b/src/dhcp-manager/nm-dhcp-dhcpcd.c @@ -89,7 +89,7 @@ dhcpcd_child_setup (gpointer user_data G_GNUC_UNUSED) static GPid ip4_start (NMDHCPClient *client, NMSettingIP4Config *s_ip4, - guint8 *dhcp_anycast_addr, + GByteArray *dhcp_anycast_addr, const char *hostname) { NMDHCPDhcpcdPrivate *priv = NM_DHCP_DHCPCD_GET_PRIVATE (client); @@ -168,7 +168,7 @@ ip4_start (NMDHCPClient *client, static GPid ip6_start (NMDHCPClient *client, NMSettingIP6Config *s_ip6, - guint8 *dhcp_anycast_addr, + GByteArray *dhcp_anycast_addr, const char *hostname, gboolean info_only, const GByteArray *duid) diff --git a/src/dhcp-manager/nm-dhcp-manager.c b/src/dhcp-manager/nm-dhcp-manager.c index 3ac220d6a4..932eaad546 100644 --- a/src/dhcp-manager/nm-dhcp-manager.c +++ b/src/dhcp-manager/nm-dhcp-manager.c @@ -456,7 +456,7 @@ client_start (NMDHCPManager *self, NMSettingIP4Config *s_ip4, NMSettingIP6Config *s_ip6, guint32 timeout, - guint8 *dhcp_anycast_addr, + GByteArray *dhcp_anycast_addr, const char *hostname, gboolean info_only) { @@ -514,7 +514,7 @@ nm_dhcp_manager_start_ip4 (NMDHCPManager *self, const char *uuid, NMSettingIP4Config *s_ip4, guint32 timeout, - guint8 *dhcp_anycast_addr) + GByteArray *dhcp_anycast_addr) { NMDHCPManagerPrivate *priv; const char *hostname, *method; @@ -558,7 +558,7 @@ nm_dhcp_manager_start_ip6 (NMDHCPManager *self, const char *uuid, NMSettingIP6Config *s_ip6, guint32 timeout, - guint8 *dhcp_anycast_addr, + GByteArray *dhcp_anycast_addr, gboolean info_only) { NMDHCPManagerPrivate *priv; diff --git a/src/dhcp-manager/nm-dhcp-manager.h b/src/dhcp-manager/nm-dhcp-manager.h index 8a33df8a50..7ab9019d61 100644 --- a/src/dhcp-manager/nm-dhcp-manager.h +++ b/src/dhcp-manager/nm-dhcp-manager.h @@ -71,7 +71,7 @@ NMDHCPClient * nm_dhcp_manager_start_ip4 (NMDHCPManager *manager, const char *uuid, NMSettingIP4Config *s_ip4, guint32 timeout, - guint8 *dhcp_anycast_addr); + GByteArray *dhcp_anycast_addr); NMDHCPClient * nm_dhcp_manager_start_ip6 (NMDHCPManager *manager, const char *iface, @@ -79,7 +79,7 @@ NMDHCPClient * nm_dhcp_manager_start_ip6 (NMDHCPManager *manager, const char *uuid, NMSettingIP6Config *s_ip6, guint32 timeout, - guint8 *dhcp_anycast_addr, + GByteArray *dhcp_anycast_addr, gboolean info_only); GSList * nm_dhcp_manager_get_lease_ip_configs (NMDHCPManager *self, diff --git a/src/dhcp-manager/tests/test-dhcp-dhclient.c b/src/dhcp-manager/tests/test-dhcp-dhclient.c index a0ede1ced9..a912d0022e 100644 --- a/src/dhcp-manager/tests/test-dhcp-dhclient.c +++ b/src/dhcp-manager/tests/test-dhcp-dhclient.c @@ -34,7 +34,7 @@ test_config (const char *orig, const char *hostname, const char *dhcp_client_id, const char *iface, - guint8 *anycast_addr) + GByteArray *anycast_addr) { NMSettingIP4Config *s_ip4; char *new; From 325d89fc850ef7e77555325c027c8007d5f7aeb1 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 10 Mar 2014 16:32:38 +0100 Subject: [PATCH 2/4] dhcp: refactor not to pass on NMSettingIP4Config objects These settings are mostly unused. Do not pass them when starting the client, instead only pass the argument that is actually used (dhcp_client_id). This simplifies the code later, when we delay starting of DHCP6 clients -- because there is no need to clone the setting. Signed-off-by: Thomas Haller --- src/dhcp-manager/nm-dhcp-client.c | 6 ++--- src/dhcp-manager/nm-dhcp-client.h | 6 ++--- src/dhcp-manager/nm-dhcp-dhclient-utils.c | 29 +++++++++------------ src/dhcp-manager/nm-dhcp-dhclient-utils.h | 3 +-- src/dhcp-manager/nm-dhcp-dhclient.c | 17 +++++------- src/dhcp-manager/nm-dhcp-dhcpcd.c | 3 +-- src/dhcp-manager/nm-dhcp-manager.c | 11 ++++---- src/dhcp-manager/tests/test-dhcp-dhclient.c | 7 +---- 8 files changed, 31 insertions(+), 51 deletions(-) diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c index a765f125bb..9f726ab302 100644 --- a/src/dhcp-manager/nm-dhcp-client.c +++ b/src/dhcp-manager/nm-dhcp-client.c @@ -295,7 +295,7 @@ start_monitor (NMDHCPClient *self) gboolean nm_dhcp_client_start_ip4 (NMDHCPClient *self, - NMSettingIP4Config *s_ip4, + const char *dhcp_client_id, GByteArray *dhcp_anycast_addr, const char *hostname) { @@ -311,7 +311,7 @@ nm_dhcp_client_start_ip4 (NMDHCPClient *self, nm_log_info (LOGD_DHCP, "Activation (%s) Beginning DHCPv4 transaction (timeout in %d seconds)", priv->iface, priv->timeout); - priv->pid = NM_DHCP_CLIENT_GET_CLASS (self)->ip4_start (self, s_ip4, dhcp_anycast_addr, hostname); + priv->pid = NM_DHCP_CLIENT_GET_CLASS (self)->ip4_start (self, dhcp_client_id, dhcp_anycast_addr, hostname); if (priv->pid) start_monitor (self); @@ -449,7 +449,6 @@ get_duid (NMDHCPClient *self) gboolean nm_dhcp_client_start_ip6 (NMDHCPClient *self, - NMSettingIP6Config *s_ip6, GByteArray *dhcp_anycast_addr, const char *hostname, gboolean info_only) @@ -482,7 +481,6 @@ nm_dhcp_client_start_ip6 (NMDHCPClient *self, priv->iface, priv->timeout); priv->pid = NM_DHCP_CLIENT_GET_CLASS (self)->ip6_start (self, - s_ip6, dhcp_anycast_addr, hostname, info_only, diff --git a/src/dhcp-manager/nm-dhcp-client.h b/src/dhcp-manager/nm-dhcp-client.h index 4daef103e9..2506547c08 100644 --- a/src/dhcp-manager/nm-dhcp-client.h +++ b/src/dhcp-manager/nm-dhcp-client.h @@ -78,12 +78,11 @@ typedef struct { /* Methods */ GPid (*ip4_start) (NMDHCPClient *self, - NMSettingIP4Config *s_ip4, + const char *dhcp_client_id, GByteArray *anycast_addr, const char *hostname); GPid (*ip6_start) (NMDHCPClient *self, - NMSettingIP6Config *s_ip6, GByteArray *anycast_addr, const char *hostname, gboolean info_only, @@ -121,12 +120,11 @@ gboolean nm_dhcp_client_get_ipv6 (NMDHCPClient *self); const char *nm_dhcp_client_get_uuid (NMDHCPClient *self); gboolean nm_dhcp_client_start_ip4 (NMDHCPClient *self, - NMSettingIP4Config *s_ip4, + const char *dhcp_client_id, GByteArray *dhcp_anycast_addr, const char *hostname); gboolean nm_dhcp_client_start_ip6 (NMDHCPClient *self, - NMSettingIP6Config *s_ip6, GByteArray *dhcp_anycast_addr, const char *hostname, gboolean info_only); diff --git a/src/dhcp-manager/nm-dhcp-dhclient-utils.c b/src/dhcp-manager/nm-dhcp-dhclient-utils.c index d95eeaeb62..3e7173aec3 100644 --- a/src/dhcp-manager/nm-dhcp-dhclient-utils.c +++ b/src/dhcp-manager/nm-dhcp-dhclient-utils.c @@ -70,21 +70,18 @@ add_hostname (GString *str, const char *format, const char *hostname) } static void -add_ip4_config (GString *str, NMSettingIP4Config *s_ip4, const char *hostname) +add_ip4_config (GString *str, const char *dhcp_client_id, const char *hostname) { - const char *tmp; - - tmp = nm_setting_ip4_config_get_dhcp_client_id (s_ip4); - if (tmp) { + if (dhcp_client_id) { gboolean is_octets = TRUE; int i = 0; - while (tmp[i]) { - if ((i % 3) != 2 && !g_ascii_isxdigit (tmp[i])) { + while (dhcp_client_id[i]) { + if ((i % 3) != 2 && !g_ascii_isxdigit (dhcp_client_id[i])) { is_octets = FALSE; break; } - if ((i % 3) == 2 && tmp[i] != ':') { + if ((i % 3) == 2 && dhcp_client_id[i] != ':') { is_octets = FALSE; break; } @@ -96,9 +93,9 @@ add_ip4_config (GString *str, NMSettingIP4Config *s_ip4, const char *hostname) * array formated as hex octets separated by : */ if (is_octets) - g_string_append_printf (str, CLIENTID_FORMAT_OCTETS "\n", tmp); + g_string_append_printf (str, CLIENTID_FORMAT_OCTETS "\n", dhcp_client_id); else - g_string_append_printf (str, CLIENTID_FORMAT "\n", tmp); + g_string_append_printf (str, CLIENTID_FORMAT "\n", dhcp_client_id); } add_hostname (str, HOSTNAME4_FORMAT "\n", hostname); @@ -117,7 +114,7 @@ add_ip4_config (GString *str, NMSettingIP4Config *s_ip4, const char *hostname) } static void -add_ip6_config (GString *str, NMSettingIP6Config *s_ip6, const char *hostname) +add_ip6_config (GString *str, const char *hostname) { add_hostname (str, HOSTNAME6_FORMAT "\n", hostname); g_string_append (str, @@ -129,8 +126,7 @@ add_ip6_config (GString *str, NMSettingIP6Config *s_ip6, const char *hostname) char * nm_dhcp_dhclient_create_config (const char *interface, gboolean is_ip6, - NMSettingIP4Config *s_ip4, - NMSettingIP6Config *s_ip6, + const char *dhcp_client_id, GByteArray *anycast_addr, const char *hostname, const char *orig_path, @@ -159,8 +155,7 @@ nm_dhcp_dhclient_create_config (const char *interface, /* Override config file "dhcp-client-id" and use one from the * connection. */ - if ( nm_setting_ip4_config_get_dhcp_client_id (s_ip4) - && !strncmp (p, CLIENTID_TAG, strlen (CLIENTID_TAG))) + if (dhcp_client_id && !strncmp (p, CLIENTID_TAG, strlen (CLIENTID_TAG))) continue; /* Override config file hostname and use one from the connection */ @@ -225,13 +220,13 @@ nm_dhcp_dhclient_create_config (const char *interface, g_string_append_c (new_contents, '\n'); if (is_ip6) { - add_ip6_config (new_contents, s_ip6, hostname); + add_ip6_config (new_contents, hostname); add_also_request (alsoreq, "dhcp6.name-servers"); add_also_request (alsoreq, "dhcp6.domain-search"); add_also_request (alsoreq, "dhcp6.client-id"); add_also_request (alsoreq, "dhcp6.server-id"); } else { - add_ip4_config (new_contents, s_ip4, hostname); + add_ip4_config (new_contents, dhcp_client_id, hostname); add_also_request (alsoreq, "rfc3442-classless-static-routes"); add_also_request (alsoreq, "ms-classless-static-routes"); add_also_request (alsoreq, "static-routes"); diff --git a/src/dhcp-manager/nm-dhcp-dhclient-utils.h b/src/dhcp-manager/nm-dhcp-dhclient-utils.h index a405d65b2d..e8d91b3147 100644 --- a/src/dhcp-manager/nm-dhcp-dhclient-utils.h +++ b/src/dhcp-manager/nm-dhcp-dhclient-utils.h @@ -27,8 +27,7 @@ char *nm_dhcp_dhclient_create_config (const char *interface, gboolean is_ip6, - NMSettingIP4Config *s_ip4, - NMSettingIP6Config *s_ip6, + const char *dhcp_client_id, GByteArray *anycast_addr, const char *hostname, const char *orig_path, diff --git a/src/dhcp-manager/nm-dhcp-dhclient.c b/src/dhcp-manager/nm-dhcp-dhclient.c index 06ebe8a064..9874074fb1 100644 --- a/src/dhcp-manager/nm-dhcp-dhclient.c +++ b/src/dhcp-manager/nm-dhcp-dhclient.c @@ -165,8 +165,7 @@ static gboolean merge_dhclient_config (const char *iface, const char *conf_file, gboolean is_ip6, - NMSettingIP4Config *s_ip4, - NMSettingIP6Config *s_ip6, + const char *dhcp_client_id, GByteArray *anycast_addr, const char *hostname, const char *orig_path, @@ -188,7 +187,7 @@ merge_dhclient_config (const char *iface, } } - new = nm_dhcp_dhclient_create_config (iface, is_ip6, s_ip4, s_ip6, anycast_addr, hostname, orig_path, orig); + new = nm_dhcp_dhclient_create_config (iface, is_ip6, dhcp_client_id, anycast_addr, hostname, orig_path, orig); g_assert (new); success = g_file_set_contents (conf_file, new, -1, error); g_free (new); @@ -272,8 +271,7 @@ static char * create_dhclient_config (const char *iface, gboolean is_ip6, const char *uuid, - NMSettingIP4Config *s_ip4, - NMSettingIP6Config *s_ip6, + const char *dhcp_client_id, GByteArray *dhcp_anycast_addr, const char *hostname) { @@ -300,7 +298,7 @@ create_dhclient_config (const char *iface, } error = NULL; - success = merge_dhclient_config (iface, new, is_ip6, s_ip4, s_ip6, dhcp_anycast_addr, hostname, orig, &error); + success = merge_dhclient_config (iface, new, is_ip6, dhcp_client_id, dhcp_anycast_addr, hostname, orig, &error); if (!success) { nm_log_warn (LOGD_DHCP, "(%s): error creating dhclient%s configuration: %s", iface, is_ip6 ? "6" : "", error->message); @@ -475,7 +473,7 @@ dhclient_start (NMDHCPClient *client, static GPid ip4_start (NMDHCPClient *client, - NMSettingIP4Config *s_ip4, + const char *dhcp_client_id, GByteArray *dhcp_anycast_addr, const char *hostname) { @@ -485,7 +483,7 @@ ip4_start (NMDHCPClient *client, iface = nm_dhcp_client_get_iface (client); uuid = nm_dhcp_client_get_uuid (client); - priv->conf_file = create_dhclient_config (iface, FALSE, uuid, s_ip4, NULL, dhcp_anycast_addr, hostname); + priv->conf_file = create_dhclient_config (iface, FALSE, uuid, dhcp_client_id, dhcp_anycast_addr, hostname); if (!priv->conf_file) { nm_log_warn (LOGD_DHCP4, "(%s): error creating dhclient configuration file.", iface); return -1; @@ -496,7 +494,6 @@ ip4_start (NMDHCPClient *client, static GPid ip6_start (NMDHCPClient *client, - NMSettingIP6Config *s_ip6, GByteArray *dhcp_anycast_addr, const char *hostname, gboolean info_only, @@ -508,7 +505,7 @@ ip6_start (NMDHCPClient *client, iface = nm_dhcp_client_get_iface (client); uuid = nm_dhcp_client_get_uuid (client); - priv->conf_file = create_dhclient_config (iface, TRUE, uuid, NULL, s_ip6, dhcp_anycast_addr, hostname); + priv->conf_file = create_dhclient_config (iface, TRUE, uuid, NULL, dhcp_anycast_addr, hostname); if (!priv->conf_file) { nm_log_warn (LOGD_DHCP6, "(%s): error creating dhclient6 configuration file.", iface); return -1; diff --git a/src/dhcp-manager/nm-dhcp-dhcpcd.c b/src/dhcp-manager/nm-dhcp-dhcpcd.c index 1ab32308c4..acfbee2692 100644 --- a/src/dhcp-manager/nm-dhcp-dhcpcd.c +++ b/src/dhcp-manager/nm-dhcp-dhcpcd.c @@ -88,7 +88,7 @@ dhcpcd_child_setup (gpointer user_data G_GNUC_UNUSED) static GPid ip4_start (NMDHCPClient *client, - NMSettingIP4Config *s_ip4, + const char *dhcp_client_id, GByteArray *dhcp_anycast_addr, const char *hostname) { @@ -167,7 +167,6 @@ ip4_start (NMDHCPClient *client, static GPid ip6_start (NMDHCPClient *client, - NMSettingIP6Config *s_ip6, GByteArray *dhcp_anycast_addr, const char *hostname, gboolean info_only, diff --git a/src/dhcp-manager/nm-dhcp-manager.c b/src/dhcp-manager/nm-dhcp-manager.c index 932eaad546..4f37768972 100644 --- a/src/dhcp-manager/nm-dhcp-manager.c +++ b/src/dhcp-manager/nm-dhcp-manager.c @@ -453,8 +453,7 @@ client_start (NMDHCPManager *self, const GByteArray *hwaddr, const char *uuid, gboolean ipv6, - NMSettingIP4Config *s_ip4, - NMSettingIP6Config *s_ip6, + const char *dhcp_client_id, guint32 timeout, GByteArray *dhcp_anycast_addr, const char *hostname, @@ -493,9 +492,9 @@ client_start (NMDHCPManager *self, add_client (self, client); if (ipv6) - success = nm_dhcp_client_start_ip6 (client, s_ip6, dhcp_anycast_addr, hostname, info_only); + success = nm_dhcp_client_start_ip6 (client, dhcp_anycast_addr, hostname, info_only); else - success = nm_dhcp_client_start_ip4 (client, s_ip4, dhcp_anycast_addr, hostname); + success = nm_dhcp_client_start_ip4 (client, dhcp_client_id, dhcp_anycast_addr, hostname); if (!success) { remove_client (self, client); @@ -547,7 +546,7 @@ nm_dhcp_manager_start_ip4 (NMDHCPManager *self, } else hostname = NULL; - return client_start (self, iface, hwaddr, uuid, FALSE, s_ip4, NULL, timeout, dhcp_anycast_addr, hostname, FALSE); + return client_start (self, iface, hwaddr, uuid, FALSE, nm_setting_ip4_config_get_dhcp_client_id (s_ip4), timeout, dhcp_anycast_addr, hostname, FALSE); } /* Caller owns a reference to the NMDHCPClient on return */ @@ -577,7 +576,7 @@ nm_dhcp_manager_start_ip6 (NMDHCPManager *self, hostname = NULL; } - return client_start (self, iface, hwaddr, uuid, TRUE, NULL, s_ip6, timeout, dhcp_anycast_addr, hostname, info_only); + return client_start (self, iface, hwaddr, uuid, TRUE, NULL, timeout, dhcp_anycast_addr, hostname, info_only); } static void diff --git a/src/dhcp-manager/tests/test-dhcp-dhclient.c b/src/dhcp-manager/tests/test-dhcp-dhclient.c index a912d0022e..c1711f095d 100644 --- a/src/dhcp-manager/tests/test-dhcp-dhclient.c +++ b/src/dhcp-manager/tests/test-dhcp-dhclient.c @@ -36,16 +36,11 @@ test_config (const char *orig, const char *iface, GByteArray *anycast_addr) { - NMSettingIP4Config *s_ip4; char *new; - s_ip4 = (NMSettingIP4Config *) nm_setting_ip4_config_new (); - g_object_set (s_ip4, NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID, dhcp_client_id, NULL); - new = nm_dhcp_dhclient_create_config (iface, FALSE, - s_ip4, - NULL, + dhcp_client_id, anycast_addr, hostname, "/path/to/dhclient.conf", From 2941109d3b8f8a17082ac598f1d3c57694f4c96c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 11 Mar 2014 14:02:24 +0100 Subject: [PATCH 3/4] dhcp: refactor using named defines for signal names instead of plain string Signed-off-by: Thomas Haller --- src/devices/nm-device.c | 8 ++++---- src/dhcp-manager/nm-dhcp-client.c | 26 +++++++++++++------------- src/dhcp-manager/nm-dhcp-client.h | 4 ++++ src/dhcp-manager/nm-dhcp-manager.c | 4 ++-- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 545f86c87a..60050727d3 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -2807,11 +2807,11 @@ dhcp4_start (NMDevice *self, } priv->dhcp4_state_sigid = g_signal_connect (priv->dhcp4_client, - "state-changed", + NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED, G_CALLBACK (dhcp4_state_changed), self); priv->dhcp4_timeout_sigid = g_signal_connect (priv->dhcp4_client, - "timeout", + NM_DHCP_CLIENT_SIGNAL_TIMEOUT, G_CALLBACK (dhcp4_timeout), self); @@ -3240,11 +3240,11 @@ dhcp6_start (NMDevice *self, if (priv->dhcp6_client) { priv->dhcp6_state_sigid = g_signal_connect (priv->dhcp6_client, - "state-changed", + NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED, G_CALLBACK (dhcp6_state_changed), self); priv->dhcp6_timeout_sigid = g_signal_connect (priv->dhcp6_client, - "timeout", + NM_DHCP_CLIENT_SIGNAL_TIMEOUT, G_CALLBACK (dhcp6_timeout), self); diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c index 9f726ab302..1ff7ac9cc5 100644 --- a/src/dhcp-manager/nm-dhcp-client.c +++ b/src/dhcp-manager/nm-dhcp-client.c @@ -58,9 +58,9 @@ typedef struct { G_DEFINE_TYPE_EXTENDED (NMDHCPClient, nm_dhcp_client, G_TYPE_OBJECT, G_TYPE_FLAG_ABSTRACT, {}) enum { - STATE_CHANGED, - TIMEOUT, - REMOVE, + SIGNAL_STATE_CHANGED, + SIGNAL_TIMEOUT, + SIGNAL_REMOVE, LAST_SIGNAL }; @@ -209,7 +209,7 @@ daemon_timeout (gpointer user_data) } else { nm_log_warn (LOGD_DHCP4, "(%s): DHCPv4 request timed out.", priv->iface); } - g_signal_emit (G_OBJECT (self), signals[TIMEOUT], 0); + g_signal_emit (G_OBJECT (self), signals[SIGNAL_TIMEOUT], 0); return FALSE; } @@ -219,7 +219,7 @@ signal_remove (gpointer user_data) NMDHCPClient *self = NM_DHCP_CLIENT (user_data); NM_DHCP_CLIENT_GET_PRIVATE (self)->remove_id = 0; - g_signal_emit (G_OBJECT (self), signals[REMOVE], 0); + g_signal_emit (G_OBJECT (self), signals[SIGNAL_REMOVE], 0); return FALSE; } @@ -234,12 +234,12 @@ dhcp_client_set_state (NMDHCPClient *self, priv->state = state; if (emit_state) - g_signal_emit (G_OBJECT (self), signals[STATE_CHANGED], 0, priv->state); + g_signal_emit (G_OBJECT (self), signals[SIGNAL_STATE_CHANGED], 0, priv->state); if (state == DHC_END || state == DHC_ABEND) { /* Start the remove signal timer */ if (remove_now) { - g_signal_emit (G_OBJECT (self), signals[REMOVE], 0); + g_signal_emit (G_OBJECT (self), signals[SIGNAL_REMOVE], 0); } else { if (!priv->remove_id) priv->remove_id = g_timeout_add_seconds (5, signal_remove, self); @@ -1634,8 +1634,8 @@ nm_dhcp_client_class_init (NMDHCPClientClass *client_class) G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); /* signals */ - signals[STATE_CHANGED] = - g_signal_new ("state-changed", + signals[SIGNAL_STATE_CHANGED] = + g_signal_new (NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED, G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (NMDHCPClientClass, state_changed), @@ -1643,8 +1643,8 @@ nm_dhcp_client_class_init (NMDHCPClientClass *client_class) g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); - signals[TIMEOUT] = - g_signal_new ("timeout", + signals[SIGNAL_TIMEOUT] = + g_signal_new (NM_DHCP_CLIENT_SIGNAL_TIMEOUT, G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (NMDHCPClientClass, timeout), @@ -1652,8 +1652,8 @@ nm_dhcp_client_class_init (NMDHCPClientClass *client_class) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); - signals[REMOVE] = - g_signal_new ("remove", + signals[SIGNAL_REMOVE] = + g_signal_new (NM_DHCP_CLIENT_SIGNAL_REMOVE, G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (NMDHCPClientClass, remove), diff --git a/src/dhcp-manager/nm-dhcp-client.h b/src/dhcp-manager/nm-dhcp-client.h index 2506547c08..104a08b153 100644 --- a/src/dhcp-manager/nm-dhcp-client.h +++ b/src/dhcp-manager/nm-dhcp-client.h @@ -40,6 +40,10 @@ #define NM_DHCP_CLIENT_UUID "uuid" #define NM_DHCP_CLIENT_TIMEOUT "timeout" +#define NM_DHCP_CLIENT_SIGNAL_TIMEOUT "timeout" +#define NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED "state-changed" +#define NM_DHCP_CLIENT_SIGNAL_REMOVE "remove" + typedef enum { DHC_NBI = 0, /* no broadcast interfaces found */ DHC_PREINIT, /* configuration started */ diff --git a/src/dhcp-manager/nm-dhcp-manager.c b/src/dhcp-manager/nm-dhcp-manager.c index 4f37768972..c9e63c7de9 100644 --- a/src/dhcp-manager/nm-dhcp-manager.c +++ b/src/dhcp-manager/nm-dhcp-manager.c @@ -438,10 +438,10 @@ add_client (NMDHCPManager *self, NMDHCPClient *client) NMDHCPManagerPrivate *priv = NM_DHCP_MANAGER_GET_PRIVATE (self); guint id; - id = g_signal_connect_swapped (client, "remove", G_CALLBACK (remove_client), self); + id = g_signal_connect_swapped (client, NM_DHCP_CLIENT_SIGNAL_REMOVE, G_CALLBACK (remove_client), self); g_object_set_data (G_OBJECT (client), REMOVE_ID_TAG, GUINT_TO_POINTER (id)); - id = g_signal_connect_swapped (client, "timeout", G_CALLBACK (remove_client), self); + id = g_signal_connect_swapped (client, NM_DHCP_CLIENT_SIGNAL_TIMEOUT, G_CALLBACK (remove_client), self); g_object_set_data (G_OBJECT (client), TIMEOUT_ID_TAG, GUINT_TO_POINTER (id)); g_hash_table_insert (priv->clients, client, g_object_ref (client)); From 0600fa0004b98302625bb3ff37c714b3ddfd3239 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 11 Mar 2014 14:34:34 +0100 Subject: [PATCH 4/4] dhcp: refactor state to string conversion Signed-off-by: Thomas Haller --- src/dhcp-manager/nm-dhcp-client.c | 83 ++++++++++++++----------------- 1 file changed, 37 insertions(+), 46 deletions(-) diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c index 1ff7ac9cc5..6cec7448a1 100644 --- a/src/dhcp-manager/nm-dhcp-client.c +++ b/src/dhcp-manager/nm-dhcp-client.c @@ -575,63 +575,54 @@ state_is_bound (guint32 state) return FALSE; } -typedef struct { - NMDHCPState state; - const char *name; -} DhcState; - -#define STATE_TABLE_SIZE (sizeof (state_table) / sizeof (state_table[0])) - -static DhcState state_table[] = { - { DHC_NBI, "nbi" }, - { DHC_PREINIT, "preinit" }, - { DHC_PREINIT6,"preinit6" }, - { DHC_BOUND4, "bound" }, - { DHC_BOUND6, "bound6" }, - { DHC_IPV4LL, "ipv4ll" }, - { DHC_RENEW4, "renew" }, - { DHC_RENEW6, "renew6" }, - { DHC_REBOOT, "reboot" }, - { DHC_REBIND4, "rebind" }, - { DHC_REBIND6, "rebind6" }, - { DHC_STOP, "stop" }, - { DHC_STOP6, "stop6" }, - { DHC_MEDIUM, "medium" }, - { DHC_TIMEOUT, "timeout" }, - { DHC_FAIL, "fail" }, - { DHC_EXPIRE, "expire" }, - { DHC_EXPIRE6, "expire6" }, - { DHC_RELEASE, "release" }, - { DHC_RELEASE6,"release6" }, - { DHC_START, "start" }, - { DHC_ABEND, "abend" }, - { DHC_END, "end" }, - { DHC_DEPREF6, "depref6" }, +static const char *state_table[] = { + [DHC_NBI] = "nbi", + [DHC_PREINIT] = "preinit", + [DHC_PREINIT6] = "preinit6", + [DHC_BOUND4] = "bound", + [DHC_BOUND6] = "bound6", + [DHC_IPV4LL] = "ipv4ll", + [DHC_RENEW4] = "renew", + [DHC_RENEW6] = "renew6", + [DHC_REBOOT] = "reboot", + [DHC_REBIND4] = "rebind", + [DHC_REBIND6] = "rebind6", + [DHC_DEPREF6] = "depref6", + [DHC_STOP] = "stop", + [DHC_STOP6] = "stop6", + [DHC_MEDIUM] = "medium", + [DHC_TIMEOUT] = "timeout", + [DHC_FAIL] = "fail", + [DHC_EXPIRE] = "expire", + [DHC_EXPIRE6] = "expire6", + [DHC_RELEASE] = "release", + [DHC_RELEASE6] = "release6", + [DHC_START] = "start", + [DHC_ABEND] = "abend", + [DHC_END] = "end", }; -static inline const char * -state_to_string (guint32 state) +static const char * +state_to_string (NMDHCPState state) { - int i; - - for (i = 0; i < STATE_TABLE_SIZE; i++) { - if (state == state_table[i].state) - return state_table[i].name; - } - + if (state >= 0 && state < G_N_ELEMENTS (state_table)) + return state_table[state]; return NULL; } -static inline NMDHCPState +static NMDHCPState string_to_state (const char *name) { int i; - for (i = 0; i < STATE_TABLE_SIZE; i++) { - if (!strcasecmp (name, state_table[i].name)) - return state_table[i].state; - } + if (name) { + for (i = 0; i < G_N_ELEMENTS (state_table); i++) { + const char *n = state_table[i]; + if (n && !strcasecmp (name, n)) + return i; + } + } return 255; }