summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-03-21 11:28:53 +0100
committerThomas Haller <thaller@redhat.com>2016-03-21 11:28:53 +0100
commita22d597f992aad8b3321628fa9f0c71bae37d163 (patch)
treeba9f634d6b6fe44507fedfa03329b4de78634355
parent53029e321d94624bbf1ff2694fd14a4cc8b5676a (diff)
downloadNetworkManager-th/wip/ipv4-shared-address-range.tar.gz
-rw-r--r--src/devices/nm-device.c30
-rw-r--r--src/nm-config-data.c29
-rw-r--r--src/nm-config-data.h5
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);