diff options
-rw-r--r-- | src/devices/nm-device.c | 30 | ||||
-rw-r--r-- | src/nm-config-data.c | 29 | ||||
-rw-r--r-- | src/nm-config-data.h | 5 |
3 files changed, 64 insertions, 0 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index f18b9c147f..2766c801a1 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -4660,6 +4660,36 @@ reserve_shared_ip (NMDevice *self, NMSettingIPConfig *s_ip4, NMPlatformIP4Addres nm_ip_address_get_address_binary (user, &a); nm_platform_ip4_address_set_addr (address, a, nm_ip_address_get_prefix (user)); } else { + guint32 network; + int total_range; + int plen; + guint32 start; + guint32 network_start, network_end, network_step; + + nm_config_data_get_ipv4_shared_address_range (NM_CONFIG_GET_DATA, + &network, + &total_range, + &plen); + + nm_assert (total_range >= 1 && total_range <= 31); + nm_assert (plen >= total_range && plen <= 32); + + network_start = network & nm_utils_ip4_prefix_to_netmask (total_range); + network_end = network_start + ntohl (1LL << total_range); + + network_sub = network_start; + do { + if (!g_hash_table_contains (shared_ips, GUINT_TO_POINTER (network_sub))) + break; + + htonl (network_sub) + + + + } while (network_sub != 0); + + network_sub = network; + network_sub = (network & ~nm_utils_ip4_prefix_to_netmask (total_range)) /* Find an unused address in the 10.42.x.x range */ guint32 start = (guint32) ntohl (0x0a2a0001); /* 10.42.0.1 */ guint32 count = 0; diff --git a/src/nm-config-data.c b/src/nm-config-data.c index 1702b551cd..d47de84b6f 100644 --- a/src/nm-config-data.c +++ b/src/nm-config-data.c @@ -72,6 +72,12 @@ typedef struct { char *dns_mode; char *rc_manager; + struct { + guint32 network; + guint8 total_range; + guint8 plen; + } shared; + NMGlobalDnsConfig *global_dns; /* mutable field */ @@ -1049,6 +1055,29 @@ global_dns_equal (NMGlobalDnsConfig *old, NMGlobalDnsConfig *new) /************************************************************************/ +void +nm_config_data_get_ipv4_shared_address_range (const NMConfigData *self, + guint32 *network, + int *total_range, + int *plen) +{ + NMConfigDataPrivate *priv; + + g_return_if_fail (NM_IS_CONFIG_DATA (self)); + + priv = NM_CONFIG_DATA_GET_PRIVATE (self); + if (G_UNLIKELY (priv->shared.network == 0)) { + priv->shared.network = ntohl (0x0a2a0001); /* 10.42.0.1 */ + priv->shared.total_range = 16; + priv->shared.plen = 24; + } + *network = priv->shared.network; + *total_range = priv->shared.total_range; + *plen = priv->shared.plen; +} + +/************************************************************************/ + char * nm_config_data_get_connection_default (const NMConfigData *self, const char *property, diff --git a/src/nm-config-data.h b/src/nm-config-data.h index 2decfdb49e..d4b079aa05 100644 --- a/src/nm-config-data.h +++ b/src/nm-config-data.h @@ -133,6 +133,11 @@ gboolean nm_config_data_get_ignore_carrier (const NMConfigData *self, NMDevice * gboolean nm_config_data_get_assume_ipv6ll_only (const NMConfigData *self, NMDevice *device); NMGlobalDnsConfig *nm_config_data_get_global_dns_config (const NMConfigData *self); +void nm_config_data_get_ipv4_shared_address_range (const NMConfigData *self, + guint32 *network, + int *total_range, + int *plen); + char *nm_config_data_get_connection_default (const NMConfigData *self, const char *property, NMDevice *device); |