diff options
author | Thomas Haller <thaller@redhat.com> | 2022-05-11 13:29:28 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2022-05-31 18:32:34 +0200 |
commit | e756533002b299896d3b7f742169c7b1690e9baf (patch) | |
tree | fc9bf683b81c9fa42ea6aca4aca0d9f0081424ad | |
parent | 05cc160494206b8d8257692fddc2e514a655c674 (diff) | |
download | NetworkManager-e756533002b299896d3b7f742169c7b1690e9baf.tar.gz |
dhcp: move addr-family specific data to union in NMDhcpClientPrivate
-rw-r--r-- | src/core/dhcp/nm-dhcp-client.c | 41 | ||||
-rw-r--r-- | src/core/dhcp/nm-dhcp-client.h | 5 |
2 files changed, 36 insertions, 10 deletions
diff --git a/src/core/dhcp/nm-dhcp-client.c b/src/core/dhcp/nm-dhcp-client.c index 0c091e61ff..0fb69b711b 100644 --- a/src/core/dhcp/nm-dhcp-client.c +++ b/src/core/dhcp/nm-dhcp-client.c @@ -45,17 +45,26 @@ typedef struct _NMDhcpClientPrivate { NMDhcpClientConfig config; const NML3ConfigData *l3cd; GSource *no_lease_timeout_source; - GSource *ipv6_lladdr_timeout_source; GSource *watch_source; GBytes *effective_client_id; - pid_t pid; - bool iaid_explicit : 1; - bool is_stopped : 1; + + union { + struct { + int _unused; + } v4; + struct { + GSource *lladdr_timeout_source; + } v6; + }; + struct { gulong id; bool wait_dhcp_commit : 1; bool wait_ll_address : 1; } l3cfg_notify; + + pid_t pid; + bool is_stopped : 1; } NMDhcpClientPrivate; G_DEFINE_ABSTRACT_TYPE(NMDhcpClient, nm_dhcp_client, G_TYPE_OBJECT) @@ -528,7 +537,7 @@ ipv6_lladdr_timeout(gpointer user_data) NMDhcpClient *self = user_data; NMDhcpClientPrivate *priv = NM_DHCP_CLIENT_GET_PRIVATE(self); - nm_clear_g_source_inst(&priv->ipv6_lladdr_timeout_source); + nm_clear_g_source_inst(&priv->v6.lladdr_timeout_source); _emit_notify( self, @@ -548,6 +557,8 @@ ipv6_lladdr_find(NMDhcpClient *self) NMDedupMultiIter iter; const NMPObject *obj; + nm_assert(!NM_IS_IPv4(priv->config.addr_family)); + l3cfg = priv->config.l3cfg; nmp_lookup_init_object(&lookup, NMP_OBJECT_TYPE_IP6_ADDRESS, nm_l3cfg_get_ifindex(l3cfg)); @@ -585,7 +596,7 @@ l3_cfg_notify_cb(NML3Cfg *l3cfg, const NML3ConfigNotifyData *notify_data, NMDhcp _LOGD("got IPv6LL address, starting transaction"); priv->l3cfg_notify.wait_ll_address = FALSE; connect_l3cfg_notify(self); - nm_clear_g_source_inst(&priv->ipv6_lladdr_timeout_source); + nm_clear_g_source_inst(&priv->v6.lladdr_timeout_source); _no_lease_timeout_schedule(self); @@ -697,7 +708,7 @@ nm_dhcp_client_start(NMDhcpClient *self, GError **error) _LOGD("waiting for IPv6LL address"); priv->l3cfg_notify.wait_ll_address = TRUE; connect_l3cfg_notify(self); - priv->ipv6_lladdr_timeout_source = + priv->v6.lladdr_timeout_source = nm_g_timeout_add_seconds_source(10, ipv6_lladdr_timeout, self); return TRUE; } @@ -1070,6 +1081,7 @@ config_init(NMDhcpClientConfig *config, const NMDhcpClientConfig *src) nm_assert(config); nm_assert(src); nm_assert(config != src); + nm_assert_addr_family(src->addr_family); *config = *src; @@ -1165,6 +1177,18 @@ set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *ps case PROP_CONFIG: /* construct-only */ config_init(&priv->config, g_value_get_pointer(value)); + + /* I know, this is technically not necessary. It just feels nicer to + * explicitly initialize the respective union member. */ + if (NM_IS_IPv4(priv->config.addr_family)) { + priv->v4 = (typeof(priv->v4)){ + ._unused = 0, + }; + } else { + priv->v6 = (typeof(priv->v6)){ + .lladdr_timeout_source = NULL, + }; + } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); @@ -1196,7 +1220,8 @@ dispose(GObject *object) watch_cleanup(self); nm_clear_g_source_inst(&priv->no_lease_timeout_source); - nm_clear_g_source_inst(&priv->ipv6_lladdr_timeout_source); + if (!NM_IS_IPv4(priv->config.addr_family)) + nm_clear_g_source_inst(&priv->v6.lladdr_timeout_source); nm_clear_pointer(&priv->effective_client_id, g_bytes_unref); nm_assert(!priv->watch_source); diff --git a/src/core/dhcp/nm-dhcp-client.h b/src/core/dhcp/nm-dhcp-client.h index 3479534de8..ef735d7df2 100644 --- a/src/core/dhcp/nm-dhcp-client.h +++ b/src/core/dhcp/nm-dhcp-client.h @@ -147,12 +147,13 @@ typedef struct { union { struct { + /* The address from the previous lease */ + const char *last_address; + /* Set BOOTP broadcast flag in request packets, so that servers * will always broadcast replies. */ bool request_broadcast : 1; - /* The address from the previous lease */ - const char *last_address; } v4; struct { /* If set, the DUID from the connection is used; otherwise |