summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2020-09-07 18:25:56 +0200
committerThomas Haller <thaller@redhat.com>2020-09-11 16:18:34 +0200
commit16e59cc37c2e66afb1e638d14e306343ca5b54a4 (patch)
tree7e2cf5edc9ae7e8c6e6ceee892c8cb4deef8a9ca
parent2fd53eb509cd3d433f094ec0f5648398be9f9bb4 (diff)
downloadNetworkManager-16e59cc37c2e66afb1e638d14e306343ca5b54a4.tar.gz
l3cfg: support tracking the DHCP lease in NML3ConfigData
-rw-r--r--src/dhcp/nm-dhcp-options.c6
-rw-r--r--src/nm-l3-config-data.c76
-rw-r--r--src/nm-l3-config-data.h11
3 files changed, 90 insertions, 3 deletions
diff --git a/src/dhcp/nm-dhcp-options.c b/src/dhcp/nm-dhcp-options.c
index d902c77c8c..6051135cea 100644
--- a/src/dhcp/nm-dhcp-options.c
+++ b/src/dhcp/nm-dhcp-options.c
@@ -219,9 +219,9 @@ nm_dhcp_option_request_string (const NMDhcpOption *requests, guint option)
void
nm_dhcp_option_take_option (GHashTable *options,
- const NMDhcpOption *requests,
- guint option,
- char *value)
+ const NMDhcpOption *requests,
+ guint option,
+ char *value)
{
nm_assert (options);
nm_assert (requests);
diff --git a/src/nm-l3-config-data.c b/src/nm-l3-config-data.c
index d547b5bd60..a060dc78f0 100644
--- a/src/nm-l3-config-data.c
+++ b/src/nm-l3-config-data.c
@@ -54,6 +54,14 @@ struct _NML3ConfigData {
union {
struct {
+ NMDhcpLease *dhcp_lease_6;
+ NMDhcpLease *dhcp_lease_4;
+ };
+ NMDhcpLease *dhcp_lease_x[2];
+ };
+
+ union {
+ struct {
GArray *nameservers_6;
GArray *nameservers_4;
};
@@ -472,6 +480,9 @@ nm_l3_config_data_unref (const NML3ConfigData *self)
nm_clear_pointer (&mutable->wins, g_array_unref);
nm_clear_pointer (&mutable->nis_servers, g_array_unref);
+ nm_clear_pointer (&mutable->dhcp_lease_4, nm_dhcp_lease_unref);
+ nm_clear_pointer (&mutable->dhcp_lease_6, nm_dhcp_lease_unref);
+
nm_clear_pointer (&mutable->nameservers_4, g_array_unref);
nm_clear_pointer (&mutable->nameservers_6, g_array_unref);
@@ -1324,6 +1335,63 @@ nm_l3_config_data_set_source (NML3ConfigData *self,
/*****************************************************************************/
+NMDhcpLease *
+nm_l3_config_data_get_dhcp_lease (const NML3ConfigData *self,
+ int addr_family)
+{
+ nm_assert (_NM_IS_L3_CONFIG_DATA (self, TRUE));
+
+ return self->dhcp_lease_x[NM_IS_IPv4 (addr_family)];
+}
+
+gboolean
+nm_l3_config_data_set_dhcp_lease (NML3ConfigData *self,
+ int addr_family,
+ NMDhcpLease *lease)
+{
+ nm_auto_unref_dhcplease NMDhcpLease *lease_old = NULL;
+ NMDhcpLease **p_lease;
+
+ nm_assert (_NM_IS_L3_CONFIG_DATA (self, FALSE));
+
+ p_lease = &self->dhcp_lease_x[NM_IS_IPv4 (addr_family)];
+
+ if (*p_lease == lease)
+ return FALSE;
+
+ if (lease)
+ nm_dhcp_lease_ref (lease);
+ lease_old = *p_lease;
+ *p_lease = lease;
+ return TRUE;
+}
+
+gboolean
+nm_l3_config_data_set_dhcp_lease_from_options (NML3ConfigData *self,
+ int addr_family,
+ GHashTable *options_take)
+{
+ nm_auto_unref_dhcplease NMDhcpLease *lease = NULL;
+ nm_auto_unref_dhcplease NMDhcpLease *lease_old = NULL;
+ NMDhcpLease **p_lease;
+
+ nm_assert (_NM_IS_L3_CONFIG_DATA (self, FALSE));
+
+ if (options_take)
+ lease = nm_dhcp_lease_new_from_options (g_steal_pointer (&options_take));
+
+ p_lease = &self->dhcp_lease_x[NM_IS_IPv4 (addr_family)];
+
+ if (*p_lease == lease)
+ return FALSE;
+
+ lease_old = *p_lease;
+ *p_lease = g_steal_pointer (&lease);
+ return TRUE;
+}
+
+/*****************************************************************************/
+
static int
_dedup_multi_index_cmp (const NML3ConfigData *a,
const NML3ConfigData *b,
@@ -1386,6 +1454,13 @@ nm_l3_config_data_cmp (const NML3ConfigData *a, const NML3ConfigData *b)
NM_CMP_RETURN (_garray_inaddr_cmp (a->nameservers_x[IS_IPv4], b->nameservers_x[IS_IPv4], addr_family));
+ NM_CMP_RETURN (nm_utils_hashtable_cmp (nm_dhcp_lease_get_options (a->dhcp_lease_x[IS_IPv4]),
+ nm_dhcp_lease_get_options (b->dhcp_lease_x[IS_IPv4]),
+ TRUE,
+ nm_strcmp_with_data,
+ nm_strcmp_with_data,
+ NULL));
+
NM_CMP_RETURN (nm_strv_ptrarray_cmp (a->domains_x[IS_IPv4], b->domains_x[IS_IPv4]));
NM_CMP_RETURN (nm_strv_ptrarray_cmp (a->searches_x[IS_IPv4], b->searches_x[IS_IPv4]));
NM_CMP_RETURN (nm_strv_ptrarray_cmp (a->dns_options_x[IS_IPv4], b->dns_options_x[IS_IPv4]));
@@ -2177,6 +2252,7 @@ nm_l3_config_data_merge (NML3ConfigData *self,
self->mtu = src->mtu;
/* self->source does not get merged. */
+ /* self->dhcp_lease_x does not get merged. */
}
NML3ConfigData *
diff --git a/src/nm-l3-config-data.h b/src/nm-l3-config-data.h
index 429325626c..2a29fad0df 100644
--- a/src/nm-l3-config-data.h
+++ b/src/nm-l3-config-data.h
@@ -486,6 +486,17 @@ gboolean nm_l3_config_data_set_dns_priority (NML3ConfigData *self,
int addr_family,
int dns_priority);
+struct _NMDhcpLease *nm_l3_config_data_get_dhcp_lease (const NML3ConfigData *self,
+ int addr_family);
+
+gboolean nm_l3_config_data_set_dhcp_lease (NML3ConfigData *self,
+ int addr_family,
+ struct _NMDhcpLease *lease);
+
+gboolean nm_l3_config_data_set_dhcp_lease_from_options (NML3ConfigData *self,
+ int addr_family,
+ GHashTable *options_take);
+
static inline const NMIPAddr *
nmtst_l3_config_data_get_best_gateway (const NML3ConfigData *self,
int addr_family)