summaryrefslogtreecommitdiff
path: root/src/platform/nm-fake-platform.c
diff options
context:
space:
mode:
authorPavel Šimerda <psimerda@redhat.com>2013-07-30 00:03:48 +0200
committerPavel Šimerda <psimerda@redhat.com>2013-07-30 11:40:19 +0200
commit68c3e1153c415111e9254c1086c82360c069bc92 (patch)
treed63dabe661ff484c7d9ad38a3de87133a7c6227c /src/platform/nm-fake-platform.c
parent3cf1b71de214e265f88cd7902d44d389a7f5c095 (diff)
downloadNetworkManager-68c3e1153c415111e9254c1086c82360c069bc92.tar.gz
platform: update all address lifetimes
The nm_platform_ip[46]_address_sync() functions no longer use nm_platform_ip[46]_address_exists() to avoid adding already existing addresses. That means nm_platform_ip[46]_address_add() is now called for *all* commited addresses and the lifetimes are thus always updated. Because of that, nm_platform_ip[46]_address_add() had to be modified to accept existing addresses and update their lifetimes when appropriate. https://bugzilla.gnome.org/show_bug.cgi?id=705102
Diffstat (limited to 'src/platform/nm-fake-platform.c')
-rw-r--r--src/platform/nm-fake-platform.c34
1 files changed, 32 insertions, 2 deletions
diff --git a/src/platform/nm-fake-platform.c b/src/platform/nm-fake-platform.c
index 0b10a27df9..8604f64aea 100644
--- a/src/platform/nm-fake-platform.c
+++ b/src/platform/nm-fake-platform.c
@@ -734,6 +734,7 @@ ip4_address_add (NMPlatform *platform, int ifindex, in_addr_t addr, int plen, gu
{
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
NMPlatformIP4Address address;
+ int i;
memset (&address, 0, sizeof (address));
address.ifindex = ifindex;
@@ -743,8 +744,22 @@ ip4_address_add (NMPlatform *platform, int ifindex, in_addr_t addr, int plen, gu
address.lifetime = lifetime;
address.preferred = preferred;
- g_array_append_val (priv->ip4_addresses, address);
+ for (i = 0; i < priv->ip4_addresses->len; i++) {
+ NMPlatformIP4Address *item = &g_array_index (priv->ip4_addresses, NMPlatformIP4Address, i);
+
+ if (item->ifindex != address.ifindex)
+ continue;
+ if (item->address != address.address)
+ continue;
+ if (item->plen != address.plen)
+ continue;
+ memcpy (item, &address, sizeof (address));
+ g_signal_emit_by_name (platform, NM_PLATFORM_IP4_ADDRESS_CHANGED, ifindex, &address);
+ return TRUE;
+ }
+
+ g_array_append_val (priv->ip4_addresses, address);
g_signal_emit_by_name (platform, NM_PLATFORM_IP4_ADDRESS_ADDED, ifindex, &address);
return TRUE;
@@ -755,6 +770,7 @@ ip6_address_add (NMPlatform *platform, int ifindex, struct in6_addr addr, int pl
{
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
NMPlatformIP6Address address;
+ int i;
memset (&address, 0, sizeof (address));
address.ifindex = ifindex;
@@ -764,8 +780,22 @@ ip6_address_add (NMPlatform *platform, int ifindex, struct in6_addr addr, int pl
address.lifetime = lifetime;
address.preferred = preferred;
- g_array_append_val (priv->ip6_addresses, address);
+ for (i = 0; i < priv->ip6_addresses->len; i++) {
+ NMPlatformIP6Address *item = &g_array_index (priv->ip6_addresses, NMPlatformIP6Address, i);
+
+ if (item->ifindex != address.ifindex)
+ continue;
+ if (!IN6_ARE_ADDR_EQUAL (&item->address, &address.address))
+ continue;
+ if (item->plen != address.plen)
+ continue;
+ memcpy (item, &address, sizeof (address));
+ g_signal_emit_by_name (platform, NM_PLATFORM_IP6_ADDRESS_CHANGED, ifindex, &address);
+ return TRUE;
+ }
+
+ g_array_append_val (priv->ip6_addresses, address);
g_signal_emit_by_name (platform, NM_PLATFORM_IP6_ADDRESS_ADDED, ifindex, &address);
return TRUE;