diff options
author | Thomas Haller <thaller@redhat.com> | 2016-04-15 21:04:43 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2016-04-15 21:04:54 +0200 |
commit | a787c7db430646cc12f4c19414323764951b08fd (patch) | |
tree | e3318a84931e1dfeaf017e814b22c957ccc5105a | |
parent | b2fb80928e27dc29240e604bab4f391302fc71f3 (diff) | |
parent | 4697376f990fdfe048b1978aaf64205da826f412 (diff) | |
download | NetworkManager-a787c7db430646cc12f4c19414323764951b08fd.tar.gz |
device: merge branch 'th/device-update-default-route'
-rw-r--r-- | src/devices/nm-device.c | 63 |
1 files changed, 43 insertions, 20 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 4bc1b1079d..1c6612df8f 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -280,11 +280,11 @@ typedef struct _NMDevicePrivate { NMIP4Config * wwan_ip4_config; /* WWAN configuration */ GSList * vpn4_configs; /* VPNs which use this device */ struct { - gboolean v4_has; - gboolean v4_is_assumed; + bool v4_has; + bool v4_is_assumed; + bool v6_has; + bool v6_is_assumed; NMPlatformIP4Route v4; - gboolean v6_has; - gboolean v6_is_assumed; NMPlatformIP6Route v6; } default_route; @@ -879,6 +879,34 @@ nm_device_get_ip6_route_metric (NMDevice *self) return _get_ipx_route_metric (self, FALSE); } +static void +_update_default_route (NMDevice *self, int addr_family, gboolean has, gboolean is_assumed) +{ + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); + bool *p_has, *p_is_assumed; + + nm_assert (NM_IN_SET (addr_family, 0, AF_INET, AF_INET6)); + + if (addr_family == AF_INET) { + p_has = &priv->default_route.v4_has; + p_is_assumed = &priv->default_route.v4_is_assumed; + } else { + p_has = &priv->default_route.v6_has; + p_is_assumed = &priv->default_route.v6_is_assumed; + } + + if (*p_has == has && *p_is_assumed == is_assumed) + return; + + *p_has = has; + *p_is_assumed = is_assumed; + + if (addr_family == AF_INET) + nm_default_route_manager_ip4_update_default_route (nm_default_route_manager_get (), self); + else + nm_default_route_manager_ip6_update_default_route (nm_default_route_manager_get (), self); +} + const NMPlatformIP4Route * nm_device_get_ip4_default_route (NMDevice *self, gboolean *out_is_assumed) { @@ -2634,11 +2662,11 @@ nm_device_removed (NMDevice *self) * is reacting via NM_DEVICE_IP4_CONFIG_CHANGED/NM_DEVICE_IP6_CONFIG_CHANGED * signal. As NMPolicy registered the NMIPxConfig instances in NMDnsManager, * these would be leaked otherwise. */ - priv->default_route.v4_has = FALSE; - priv->default_route.v4_is_assumed = TRUE; + _update_default_route (self, AF_INET, priv->default_route.v4_has, TRUE); + _update_default_route (self, AF_INET6, priv->default_route.v6_has, TRUE); + _update_default_route (self, AF_INET, FALSE, TRUE); + _update_default_route (self, AF_INET6, FALSE, TRUE); nm_device_set_ip4_config (self, NULL, 0, FALSE, FALSE, NULL); - priv->default_route.v6_has = FALSE; - priv->default_route.v6_is_assumed = TRUE; nm_device_set_ip6_config (self, NULL, FALSE, FALSE, NULL); } @@ -10036,20 +10064,15 @@ _cleanup_generic_post (NMDevice *self, CleanupType cleanup_type) { NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); - priv->default_route.v4_has = FALSE; - priv->default_route.v6_has = FALSE; - if (cleanup_type == CLEANUP_TYPE_DECONFIGURE) { - priv->default_route.v4_is_assumed = FALSE; - priv->default_route.v6_is_assumed = FALSE; - nm_default_route_manager_ip4_update_default_route (nm_default_route_manager_get (), self); - nm_default_route_manager_ip6_update_default_route (nm_default_route_manager_get (), self); + _update_default_route (self, AF_INET, FALSE, FALSE); + _update_default_route (self, AF_INET6, FALSE, FALSE); + } else { + _update_default_route (self, AF_INET, priv->default_route.v4_has, TRUE); + _update_default_route (self, AF_INET6, priv->default_route.v6_has, TRUE); } - - priv->default_route.v4_is_assumed = TRUE; - priv->default_route.v6_is_assumed = TRUE; - nm_default_route_manager_ip4_update_default_route (nm_default_route_manager_get (), self); - nm_default_route_manager_ip6_update_default_route (nm_default_route_manager_get (), self); + _update_default_route (self, AF_INET, FALSE, TRUE); + _update_default_route (self, AF_INET6, FALSE, TRUE); priv->v4_commit_first_time = TRUE; priv->v6_commit_first_time = TRUE; |