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.
This commit is contained in:
Thomas Haller 2022-05-10 22:04:08 +02:00
parent 2b8aeba06d
commit 7f943f5fa6
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
3 changed files with 26 additions and 43 deletions

View file

@ -669,54 +669,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);
}

View file

@ -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);

View file

@ -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);