summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/devices/nm-device.c50
1 files changed, 13 insertions, 37 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index c1a2bab12b..f0fe5a0385 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -327,6 +327,8 @@ typedef struct _NMDevicePrivate {
const NML3ConfigData *l3cds[_L3_CONFIG_DATA_TYPE_NUM];
+ NMNetnsSharedIPHandle *shared_ip_handle;
+
int parent_ifindex;
int auth_retries;
@@ -9649,21 +9651,11 @@ nm_device_dhcp4_renew (NMDevice *self, gboolean release)
/*****************************************************************************/
-static GHashTable *shared_ips = NULL;
-
-static void
-shared_ip_release (gpointer data)
-{
- g_hash_table_remove (shared_ips, data);
- if (!g_hash_table_size (shared_ips))
- nm_clear_pointer (&shared_ips, g_hash_table_unref);
-}
-
static NMIP4Config *
shared4_new_config (NMDevice *self, NMConnection *connection)
{
- NMIP4Config *config = NULL;
- gboolean is_generated = FALSE;
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ NMIP4Config *config;
NMSettingIPConfig *s_ip4;
NMPlatformIP4Address address = {
.addr_source = NM_IP_CONFIG_SOURCE_SHARED,
@@ -9673,42 +9665,24 @@ shared4_new_config (NMDevice *self, NMConnection *connection)
g_return_val_if_fail (connection, NULL);
s_ip4 = nm_connection_get_setting_ip4_config (connection);
- if (s_ip4 && nm_setting_ip_config_get_num_addresses (s_ip4)) {
+ if ( s_ip4
+ && nm_setting_ip_config_get_num_addresses (s_ip4) > 0) {
/* Use the first user-supplied address */
NMIPAddress *user = nm_setting_ip_config_get_address (s_ip4, 0);
in_addr_t a;
nm_ip_address_get_address_binary (user, &a);
nm_platform_ip4_address_set_addr (&address, a, nm_ip_address_get_prefix (user));
+ nm_clear_pointer (&priv->shared_ip_handle, nm_netns_shared_ip_release);
} else {
- /* Find an unused address in the 10.42.x.x range */
- guint32 start = (guint32) ntohl (0x0a2a0001); /* 10.42.0.1 */
- guint32 count = 0;
-
- if (G_UNLIKELY (!shared_ips))
- shared_ips = g_hash_table_new (nm_direct_hash, NULL);
- else {
- while (g_hash_table_lookup (shared_ips, GUINT_TO_POINTER (start + count))) {
- count += ntohl (0x100);
- if (count > ntohl (0xFE00)) {
- _LOGE (LOGD_SHARING, "ran out of shared IP addresses!");
- return FALSE;
- }
- }
- }
- nm_platform_ip4_address_set_addr (&address, start + count, 24);
- g_hash_table_add (shared_ips, GUINT_TO_POINTER (address.address));
- is_generated = TRUE;
+ if (!priv->shared_ip_handle)
+ priv->shared_ip_handle = nm_netns_shared_ip_reserve (nm_device_get_netns (self));
+ nm_platform_ip4_address_set_addr (&address, priv->shared_ip_handle->addr, 24);
}
config = nm_device_ip4_config_new (self);
nm_ip4_config_add_address (config, &address);
- if (is_generated) {
- /* Remove the address lock when the object gets disposed */
- g_object_set_qdata_full (G_OBJECT (config), NM_CACHED_QUARK ("shared-ip"),
- GUINT_TO_POINTER (address.address),
- shared_ip_release);
- }
+
return config;
}
@@ -15936,6 +15910,8 @@ _cleanup_generic_pre (NMDevice *self, CleanupType cleanup_type)
queued_state_clear (self);
+ nm_clear_pointer (&priv->shared_ip_handle, nm_netns_shared_ip_release);
+
_cleanup_ip_pre (self, AF_INET, cleanup_type);
_cleanup_ip_pre (self, AF_INET6, cleanup_type);
}