From 9d1f40afc33bb2c738c4e8cf6d4f4433718b2f2e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 10 May 2022 22:04:08 +0200 Subject: [PATCH] dhcp: merge nm_dhcp_client_start_ip4() and nm_dhcp_client_start_ip6() implementations As almost always, there is a point in keeping IPv4 and IPv6 implementations similar. Behave different where there is an actual difference, at the bottom of the stack. (cherry picked from commit 7f943f5fa6bbc799cde40f745496fd69ff5b0e38) (cherry picked from commit 0edfa4456aef98672cf2f255e3ffbbb2dc45993f) --- src/core/dhcp/nm-dhcp-client.c | 55 ++++++++++++++------------------- src/core/dhcp/nm-dhcp-client.h | 3 +- src/core/dhcp/nm-dhcp-manager.c | 11 ++----- 3 files changed, 26 insertions(+), 43 deletions(-) diff --git a/src/core/dhcp/nm-dhcp-client.c b/src/core/dhcp/nm-dhcp-client.c index 185e028137..cb70c5ea4d 100644 --- a/src/core/dhcp/nm-dhcp-client.c +++ b/src/core/dhcp/nm-dhcp-client.c @@ -676,54 +676,45 @@ l3_cfg_notify_cb(NML3Cfg *l3cfg, const NML3ConfigNotifyData *notify_data, NMDhcp } gboolean -nm_dhcp_client_start_ip4(NMDhcpClient *self, GError **error) -{ - NMDhcpClientPrivate *priv; - - g_return_val_if_fail(NM_IS_DHCP_CLIENT(self), FALSE); - - priv = NM_DHCP_CLIENT_GET_PRIVATE(self); - g_return_val_if_fail(priv->pid == -1, FALSE); - g_return_val_if_fail(priv->config.addr_family == AF_INET, FALSE); - g_return_val_if_fail(priv->config.uuid, FALSE); - - _no_lease_timeout_schedule(self); - - return NM_DHCP_CLIENT_GET_CLASS(self)->ip4_start(self, error); -} - -gboolean -nm_dhcp_client_start_ip6(NMDhcpClient *self, GError **error) +nm_dhcp_client_start(NMDhcpClient *self, GError **error) { NMDhcpClientPrivate *priv; gs_unref_bytes GBytes *own_client_id = NULL; - const NMPlatformIP6Address *addr; + const NMPlatformIP6Address *addr = NULL; + int IS_IPv4; g_return_val_if_fail(NM_IS_DHCP_CLIENT(self), FALSE); + priv = NM_DHCP_CLIENT_GET_PRIVATE(self); g_return_val_if_fail(priv->pid == -1, FALSE); - g_return_val_if_fail(priv->config.addr_family == AF_INET6, FALSE); g_return_val_if_fail(priv->config.uuid, FALSE); - g_return_val_if_fail(!priv->effective_client_id, FALSE); + nm_assert(!priv->effective_client_id); - if (!priv->config.v6.enforce_duid) - own_client_id = NM_DHCP_CLIENT_GET_CLASS(self)->get_duid(self); + IS_IPv4 = NM_IS_IPv4(priv->config.addr_family); - nm_dhcp_client_set_effective_client_id(self, own_client_id ?: priv->config.client_id); + if (!IS_IPv4) { + if (!priv->config.v6.enforce_duid) + own_client_id = NM_DHCP_CLIENT_GET_CLASS(self)->get_duid(self); - addr = ipv6_lladdr_find(self); - if (!addr) { - _LOGD("waiting for IPv6LL address"); - priv->l3cfg_notify.wait_ll_address = TRUE; - connect_l3cfg_notify(self); - priv->ipv6_lladdr_timeout_source = - nm_g_timeout_add_seconds_source(10, ipv6_lladdr_timeout, self); - return TRUE; + nm_dhcp_client_set_effective_client_id(self, own_client_id ?: priv->config.client_id); + + addr = ipv6_lladdr_find(self); + if (!addr) { + _LOGD("waiting for IPv6LL address"); + priv->l3cfg_notify.wait_ll_address = TRUE; + connect_l3cfg_notify(self); + priv->ipv6_lladdr_timeout_source = + nm_g_timeout_add_seconds_source(10, ipv6_lladdr_timeout, self); + return TRUE; + } } _no_lease_timeout_schedule(self); + if (IS_IPv4) + return NM_DHCP_CLIENT_GET_CLASS(self)->ip4_start(self, error); + return NM_DHCP_CLIENT_GET_CLASS(self)->ip6_start(self, &addr->address, error); } diff --git a/src/core/dhcp/nm-dhcp-client.h b/src/core/dhcp/nm-dhcp-client.h index 7b88ae6b46..274a954b6c 100644 --- a/src/core/dhcp/nm-dhcp-client.h +++ b/src/core/dhcp/nm-dhcp-client.h @@ -230,8 +230,7 @@ typedef struct { GType nm_dhcp_client_get_type(void); -gboolean nm_dhcp_client_start_ip4(NMDhcpClient *self, GError **error); -gboolean nm_dhcp_client_start_ip6(NMDhcpClient *self, GError **error); +gboolean nm_dhcp_client_start(NMDhcpClient *self, GError **error); const NMDhcpClientConfig *nm_dhcp_client_get_config(NMDhcpClient *self); diff --git a/src/core/dhcp/nm-dhcp-manager.c b/src/core/dhcp/nm-dhcp-manager.c index f353e63773..9fea166614 100644 --- a/src/core/dhcp/nm-dhcp-manager.c +++ b/src/core/dhcp/nm-dhcp-manager.c @@ -131,8 +131,7 @@ NMDhcpClient * nm_dhcp_manager_start_client(NMDhcpManager *self, NMDhcpClientConfig *config, GError **error) { NMDhcpManagerPrivate *priv; - gs_unref_object NMDhcpClient *client = NULL; - gboolean success = FALSE; + gs_unref_object NMDhcpClient *client = NULL; gsize hwaddr_len; GType gtype; @@ -202,13 +201,7 @@ nm_dhcp_manager_start_client(NMDhcpManager *self, NMDhcpClientConfig *config, GE * default outside of NetworkManager API. */ - if (config->addr_family == AF_INET) { - success = nm_dhcp_client_start_ip4(client, error); - } else { - success = nm_dhcp_client_start_ip6(client, error); - } - - if (!success) + if (!nm_dhcp_client_start(client, error)) return NULL; return g_steal_pointer(&client);