dhcp: refactor DHCP anycast_address to be property of NMDhcpClient

Instead of passing the setting on during ip4_start()/ip6_start(), make
it a property of NMDhcpClient.

This property is currently only set by OLPC devices, and is only
implemented by NMDhcpDhclient. As such, it also does not need to change
or get reset. Hence, and immutable, construct-only property is clearer,
because we don't have to pass parameters to ip[46]_start().

Arguably, the parameter is still there, but being immutable and always
set, make it easier to reason about it.
This commit is contained in:
Thomas Haller
2021-05-12 12:16:36 +02:00
parent 658c6a4146
commit 5aa7e254bd
10 changed files with 69 additions and 62 deletions

View File

@@ -13,6 +13,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <linux/rtnetlink.h>
#include <linux/if_ether.h>
#include "libnm-glib-aux/nm-dedup-multi.h"
#include "libnm-glib-aux/nm-random-utils.h"
@@ -33,6 +34,7 @@ static guint signals[LAST_SIGNAL] = {0};
NM_GOBJECT_PROPERTIES_DEFINE(NMDhcpClient,
PROP_ADDR_FAMILY,
PROP_ANYCAST_ADDRESS,
PROP_FLAGS,
PROP_HWADDR,
PROP_BROADCAST_HWADDR,
@@ -61,6 +63,7 @@ typedef struct _NMDhcpClientPrivate {
char * hostname;
const char ** reject_servers;
char * mud_url;
char * anycast_address;
GBytes * vendor_class_identifier;
pid_t pid;
guint timeout_id;
@@ -280,6 +283,14 @@ nm_dhcp_client_set_client_id_bin(NMDhcpClient *self,
_set_client_id(self, b, TRUE);
}
const char *
nm_dhcp_client_get_anycast_address(NMDhcpClient *self)
{
g_return_val_if_fail(NM_IS_DHCP_CLIENT(self), NULL);
return NM_DHCP_CLIENT_GET_PRIVATE(self)->anycast_address;
}
const char *
nm_dhcp_client_get_hostname(NMDhcpClient *self)
{
@@ -574,7 +585,6 @@ nm_dhcp_client_stop_watch_child(NMDhcpClient *self, pid_t pid)
gboolean
nm_dhcp_client_start_ip4(NMDhcpClient *self,
GBytes * client_id,
const char * dhcp_anycast_addr,
const char * last_ip4_address,
GError ** error)
{
@@ -594,10 +604,7 @@ nm_dhcp_client_start_ip4(NMDhcpClient *self,
nm_dhcp_client_set_client_id(self, client_id);
return NM_DHCP_CLIENT_GET_CLASS(self)->ip4_start(self,
dhcp_anycast_addr,
last_ip4_address,
error);
return NM_DHCP_CLIENT_GET_CLASS(self)->ip4_start(self, last_ip4_address, error);
}
gboolean
@@ -634,7 +641,6 @@ gboolean
nm_dhcp_client_start_ip6(NMDhcpClient * self,
GBytes * client_id,
gboolean enforce_duid,
const char * dhcp_anycast_addr,
const struct in6_addr * ll_addr,
NMSettingIP6ConfigPrivacy privacy,
guint needed_prefixes,
@@ -663,8 +669,11 @@ nm_dhcp_client_start_ip6(NMDhcpClient * self,
else
_LOGI("activation: beginning transaction (timeout in %u seconds)", (guint) priv->timeout);
return NM_DHCP_CLIENT_GET_CLASS(self)
->ip6_start(self, dhcp_anycast_addr, ll_addr, privacy, needed_prefixes, error);
return NM_DHCP_CLIENT_GET_CLASS(self)->ip6_start(self,
ll_addr,
privacy,
needed_prefixes,
error);
}
void
@@ -1073,6 +1082,10 @@ set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *ps
/* construct-only */
priv->hwaddr = g_value_dup_boxed(value);
break;
case PROP_ANYCAST_ADDRESS:
/* construct-only */
priv->anycast_address = g_value_dup_string(value);
break;
case PROP_BROADCAST_HWADDR:
/* construct-only */
priv->bcast_hwaddr = g_value_dup_boxed(value);
@@ -1162,6 +1175,8 @@ constructed(GObject *object)
nm_assert(!NM_FLAGS_ANY(priv->client_flags, NM_DHCP_CLIENT_FLAGS_REQUEST_BROADCAST));
}
nm_assert(!priv->anycast_address || nm_utils_hwaddr_valid(priv->anycast_address, ETH_ALEN));
G_OBJECT_CLASS(nm_dhcp_client_parent_class)->constructed(object);
}
#endif
@@ -1185,6 +1200,7 @@ dispose(GObject *object)
nm_clear_g_free(&priv->iface);
nm_clear_g_free(&priv->hostname);
nm_clear_g_free(&priv->uuid);
nm_clear_g_free(&priv->anycast_address);
nm_clear_g_free(&priv->mud_url);
nm_clear_g_free(&priv->reject_servers);
nm_clear_pointer(&priv->client_id, g_bytes_unref);
@@ -1259,6 +1275,13 @@ nm_dhcp_client_class_init(NMDhcpClientClass *client_class)
AF_UNSPEC,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
obj_properties[PROP_ANYCAST_ADDRESS] =
g_param_spec_string(NM_DHCP_CLIENT_ANYCAST_ADDRESS,
"",
"",
NULL,
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
obj_properties[PROP_UUID] =
g_param_spec_string(NM_DHCP_CLIENT_UUID,
"",

View File

@@ -25,6 +25,7 @@
(G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_DHCP_CLIENT, NMDhcpClientClass))
#define NM_DHCP_CLIENT_ADDR_FAMILY "addr-family"
#define NM_DHCP_CLIENT_ANYCAST_ADDRESS "anycast-address"
#define NM_DHCP_CLIENT_FLAGS "flags"
#define NM_DHCP_CLIENT_HWADDR "hwaddr"
#define NM_DHCP_CLIENT_BROADCAST_HWADDR "broadcast-hwaddr"
@@ -82,17 +83,13 @@ typedef enum _nm_packed {
typedef struct {
GObjectClass parent;
gboolean (*ip4_start)(NMDhcpClient *self,
const char * anycast_addr,
const char * last_ip4_address,
GError ** error);
gboolean (*ip4_start)(NMDhcpClient *self, const char *last_ip4_address, GError **error);
gboolean (*accept)(NMDhcpClient *self, GError **error);
gboolean (*decline)(NMDhcpClient *self, const char *error_message, GError **error);
gboolean (*ip6_start)(NMDhcpClient * self,
const char * anycast_addr,
const struct in6_addr * ll_addr,
NMSettingIP6ConfigPrivacy privacy,
guint needed_prefixes,
@@ -132,6 +129,8 @@ GBytes *nm_dhcp_client_get_hw_addr(NMDhcpClient *self);
GBytes *nm_dhcp_client_get_broadcast_hw_addr(NMDhcpClient *self);
const char *nm_dhcp_client_get_anycast_address(NMDhcpClient *self);
guint32 nm_dhcp_client_get_route_table(NMDhcpClient *self);
void nm_dhcp_client_set_route_table(NMDhcpClient *self, guint32 route_table);
@@ -160,14 +159,12 @@ GBytes *nm_dhcp_client_get_vendor_class_identifier(NMDhcpClient *self);
gboolean nm_dhcp_client_start_ip4(NMDhcpClient *self,
GBytes * client_id,
const char * dhcp_anycast_addr,
const char * last_ip4_address,
GError ** error);
gboolean nm_dhcp_client_start_ip6(NMDhcpClient * self,
GBytes * client_id,
gboolean enforce_duid,
const char * dhcp_anycast_addr,
const struct in6_addr * ll_addr,
NMSettingIP6ConfigPrivacy privacy,
guint needed_prefixes,

View File

@@ -291,7 +291,7 @@ char *
nm_dhcp_dhclient_create_config(const char * interface,
int addr_family,
GBytes * client_id,
const char * anycast_addr,
const char * anycast_address,
const char * hostname,
guint32 timeout,
gboolean use_fqdn,
@@ -308,7 +308,8 @@ nm_dhcp_dhclient_create_config(const char * interface,
gboolean reset_reqlist = FALSE;
int i;
g_return_val_if_fail(!anycast_addr || nm_utils_hwaddr_valid(anycast_addr, ETH_ALEN), NULL);
g_return_val_if_fail(!anycast_address || nm_utils_hwaddr_valid(anycast_address, ETH_ALEN),
NULL);
g_return_val_if_fail(NM_IN_SET(addr_family, AF_INET, AF_INET6), NULL);
g_return_val_if_fail(!reject_servers || addr_family == AF_INET, NULL);
nm_assert(!out_new_client_id || !*out_new_client_id);
@@ -508,14 +509,14 @@ nm_dhcp_dhclient_create_config(const char * interface,
g_string_append_c(new_contents, '\n');
if (anycast_addr) {
if (anycast_address) {
g_string_append_printf(new_contents,
"interface \"%s\" {\n"
" initial-interval 1; \n"
" anycast-mac ethernet %s;\n"
"}\n",
interface,
anycast_addr);
anycast_address);
}
return g_string_free(g_steal_pointer(&new_contents), FALSE);

View File

@@ -151,7 +151,7 @@ merge_dhclient_config(NMDhcpDhclient * self,
const char * iface,
const char * conf_file,
GBytes * client_id,
const char * anycast_addr,
const char * anycast_address,
const char * hostname,
guint32 timeout,
gboolean use_fqdn,
@@ -180,7 +180,7 @@ merge_dhclient_config(NMDhcpDhclient * self,
new = nm_dhcp_dhclient_create_config(iface,
addr_family,
client_id,
anycast_addr,
anycast_address,
hostname,
timeout,
use_fqdn,
@@ -280,7 +280,7 @@ create_dhclient_config(NMDhcpDhclient * self,
const char * iface,
const char * uuid,
GBytes * client_id,
const char * dhcp_anycast_addr,
const char * anycast_address,
const char * hostname,
guint32 timeout,
gboolean use_fqdn,
@@ -312,7 +312,7 @@ create_dhclient_config(NMDhcpDhclient * self,
iface,
new,
client_id,
dhcp_anycast_addr,
anycast_address,
hostname,
timeout,
use_fqdn,
@@ -514,10 +514,7 @@ dhclient_start(NMDhcpClient *client,
}
static gboolean
ip4_start(NMDhcpClient *client,
const char * dhcp_anycast_addr,
const char * last_ip4_address,
GError ** error)
ip4_start(NMDhcpClient *client, const char *last_ip4_address, GError **error)
{
NMDhcpDhclient * self = NM_DHCP_DHCLIENT(client);
NMDhcpDhclientPrivate *priv = NM_DHCP_DHCLIENT_GET_PRIVATE(self);
@@ -532,7 +529,7 @@ ip4_start(NMDhcpClient *client,
nm_dhcp_client_get_iface(client),
nm_dhcp_client_get_uuid(client),
client_id,
dhcp_anycast_addr,
nm_dhcp_client_get_anycast_address(client),
nm_dhcp_client_get_hostname(client),
nm_dhcp_client_get_timeout(client),
NM_FLAGS_HAS(nm_dhcp_client_get_client_flags(client), NM_DHCP_CLIENT_FLAGS_USE_FQDN),
@@ -556,7 +553,6 @@ ip4_start(NMDhcpClient *client,
static gboolean
ip6_start(NMDhcpClient * client,
const char * dhcp_anycast_addr,
const struct in6_addr * ll_addr,
NMSettingIP6ConfigPrivacy privacy,
guint needed_prefixes,
@@ -573,7 +569,7 @@ ip6_start(NMDhcpClient * client,
nm_dhcp_client_get_iface(client),
nm_dhcp_client_get_uuid(client),
NULL,
dhcp_anycast_addr,
nm_dhcp_client_get_anycast_address(client),
nm_dhcp_client_get_hostname(client),
nm_dhcp_client_get_timeout(client),
TRUE,

View File

@@ -161,10 +161,7 @@ dhcpcanon_start(NMDhcpClient *client,
}
static gboolean
ip4_start(NMDhcpClient *client,
const char * dhcp_anycast_addr,
const char * last_ip4_address,
GError ** error)
ip4_start(NMDhcpClient *client, const char *last_ip4_address, GError **error)
{
return dhcpcanon_start(client, NULL, NULL, FALSE, NULL, 0, error);
}

View File

@@ -65,10 +65,7 @@ nm_dhcp_dhcpcd_get_path(void)
}
static gboolean
ip4_start(NMDhcpClient *client,
const char * dhcp_anycast_addr,
const char * last_ip4_address,
GError ** error)
ip4_start(NMDhcpClient *client, const char *last_ip4_address, GError **error)
{
NMDhcpDhcpcd * self = NM_DHCP_DHCPCD(client);
gs_unref_ptrarray GPtrArray *argv = NULL;

View File

@@ -214,7 +214,7 @@ client_start(NMDhcpManager * self,
gboolean iaid_explicit,
guint32 timeout,
NMDhcpClientFlags client_flags,
const char * dhcp_anycast_addr,
const char * anycast_address,
const char * hostname,
NMDhcpHostnameFlags hostname_flags,
const char * mud_url,
@@ -337,6 +337,8 @@ client_start(NMDhcpManager * self,
reject_servers,
NM_DHCP_CLIENT_FLAGS,
(guint) client_flags,
NM_DHCP_CLIENT_ANYCAST_ADDRESS,
anycast_address,
NULL);
nm_assert(client && c_list_is_empty(&client->dhcp_client_lst));
c_list_link_tail(&priv->dhcp_client_lst_head, &client->dhcp_client_lst);
@@ -372,16 +374,11 @@ client_start(NMDhcpManager * self,
*/
if (addr_family == AF_INET) {
success = nm_dhcp_client_start_ip4(client,
dhcp_client_id,
dhcp_anycast_addr,
last_ip4_address,
error);
success = nm_dhcp_client_start_ip4(client, dhcp_client_id, last_ip4_address, error);
} else {
success = nm_dhcp_client_start_ip6(client,
dhcp_client_id,
enforce_duid,
dhcp_anycast_addr,
ipv6_ll_addr,
privacy,
needed_prefixes,
@@ -415,7 +412,7 @@ nm_dhcp_manager_start_ip4(NMDhcpManager * self,
const char * mud_url,
GBytes * dhcp_client_id,
guint32 timeout,
const char * dhcp_anycast_addr,
const char * anycast_address,
const char * last_ip_address,
GBytes * vendor_class_identifier,
const char *const * reject_servers,
@@ -475,7 +472,7 @@ nm_dhcp_manager_start_ip4(NMDhcpManager * self,
FALSE,
timeout,
client_flags | (use_fqdn ? NM_DHCP_CLIENT_FLAGS_USE_FQDN : NM_DHCP_CLIENT_FLAGS_NONE),
dhcp_anycast_addr,
anycast_address,
hostname,
hostname_flags,
mud_url,
@@ -507,7 +504,7 @@ nm_dhcp_manager_start_ip6(NMDhcpManager * self,
guint32 iaid,
gboolean iaid_explicit,
guint32 timeout,
const char * dhcp_anycast_addr,
const char * anycast_address,
NMSettingIP6ConfigPrivacy privacy,
guint needed_prefixes,
GError ** error)
@@ -542,7 +539,7 @@ nm_dhcp_manager_start_ip6(NMDhcpManager * self,
iaid_explicit,
timeout,
client_flags | NM_DHCP_CLIENT_FLAGS_USE_FQDN,
dhcp_anycast_addr,
anycast_address,
hostname,
hostname_flags,
mud_url,

View File

@@ -49,7 +49,7 @@ NMDhcpClient *nm_dhcp_manager_start_ip4(NMDhcpManager * manager,
const char * mud_url,
GBytes * dhcp_client_id,
guint32 timeout,
const char * dhcp_anycast_addr,
const char * anycast_address,
const char * last_ip_address,
GBytes * vendor_class_identifier,
const char *const * reject_servers,
@@ -73,7 +73,7 @@ NMDhcpClient *nm_dhcp_manager_start_ip6(NMDhcpManager * manager,
guint32 iaid,
gboolean iaid_explicit,
guint32 timeout,
const char * dhcp_anycast_addr,
const char * anycast_address,
NMSettingIP6ConfigPrivacy privacy,
guint needed_prefixes,
GError ** error);

View File

@@ -874,7 +874,7 @@ dhcp4_event_cb(int fd, GIOCondition condition, gpointer user_data)
}
static gboolean
nettools_create(NMDhcpNettools *self, const char *dhcp_anycast_addr, GError **error)
nettools_create(NMDhcpNettools *self, GError **error)
{
NMDhcpNettoolsPrivate *priv = NM_DHCP_NETTOOLS_GET_PRIVATE(self);
nm_auto(n_dhcp4_client_config_freep) NDhcp4ClientConfig *config = NULL;
@@ -893,6 +893,8 @@ nettools_create(NMDhcpNettools *self, const char *dhcp_anycast_addr, GError **er
g_return_val_if_fail(!priv->client, FALSE);
/* TODO: honor nm_dhcp_client_get_anycast_address() */
hwaddr = nm_dhcp_client_get_hw_addr(NM_DHCP_CLIENT(self));
if (!hwaddr || !(hwaddr_arr = g_bytes_get_data(hwaddr, &hwaddr_len))
|| (arp_type = nm_utils_arp_type_detect_from_hwaddrlen(hwaddr_len)) < 0) {
@@ -1035,10 +1037,7 @@ fqdn_flags_to_wire(NMDhcpHostnameFlags flags)
}
static gboolean
ip4_start(NMDhcpClient *client,
const char * dhcp_anycast_addr,
const char * last_ip4_address,
GError ** error)
ip4_start(NMDhcpClient *client, const char *last_ip4_address, GError **error)
{
nm_auto(n_dhcp4_client_probe_config_freep) NDhcp4ClientProbeConfig *config = NULL;
NMDhcpNettools * self = NM_DHCP_NETTOOLS(client);
@@ -1052,7 +1051,7 @@ ip4_start(NMDhcpClient *client,
g_return_val_if_fail(!priv->probe, FALSE);
if (!nettools_create(self, dhcp_anycast_addr, error))
if (!nettools_create(self, error))
return FALSE;
r = n_dhcp4_client_probe_config_new(&config);

View File

@@ -543,10 +543,7 @@ dhcp_event_cb(sd_dhcp_client *client, int event, gpointer user_data)
}
static gboolean
ip4_start(NMDhcpClient *client,
const char * dhcp_anycast_addr,
const char * last_ip4_address,
GError ** error)
ip4_start(NMDhcpClient *client, const char *last_ip4_address, GError **error)
{
nm_auto(sd_dhcp_client_unrefp) sd_dhcp_client *sd_client = NULL;
NMDhcpSystemd * self = NM_DHCP_SYSTEMD(client);
@@ -572,6 +569,8 @@ ip4_start(NMDhcpClient *client,
g_return_val_if_fail(!priv->client4, FALSE);
g_return_val_if_fail(!priv->client6, FALSE);
/* TODO: honor nm_dhcp_client_get_anycast_address() */
r = sd_dhcp_client_new(&sd_client, FALSE);
if (r < 0) {
nm_utils_error_set_errno(error, r, "failed to create dhcp-client: %s");
@@ -912,7 +911,6 @@ dhcp6_event_cb(sd_dhcp6_client *client, int event, gpointer user_data)
static gboolean
ip6_start(NMDhcpClient * client,
const char * dhcp_anycast_addr,
const struct in6_addr * ll_addr,
NMSettingIP6ConfigPrivacy privacy,
guint needed_prefixes,
@@ -931,6 +929,8 @@ ip6_start(NMDhcpClient * client,
g_return_val_if_fail(!priv->client4, FALSE);
g_return_val_if_fail(!priv->client6, FALSE);
/* TODO: honor nm_dhcp_client_get_anycast_address() */
if (!(duid = nm_dhcp_client_get_client_id(client))
|| !(duid_arr = g_bytes_get_data(duid, &duid_len)) || duid_len < 2) {
nm_utils_error_set_literal(error, NM_UTILS_ERROR_UNKNOWN, "missing DUID");