summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2017-11-30 14:11:04 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2017-12-06 09:53:18 +0100
commit0decb9eac614a9a98b3fc5a48307a2e2b63ae36e (patch)
tree52b07064764c18eedff500c380e947f41d17bbe8
parent7217ec09e34324e14a0a9d8b519e9cc1aa2b98b4 (diff)
downloadNetworkManager-0decb9eac614a9a98b3fc5a48307a2e2b63ae36e.tar.gz
device: restore original dynamic IPv6 configuration on reapply
-rw-r--r--src/devices/nm-device.c253
-rw-r--r--src/nm-ip4-config.h49
-rw-r--r--src/platform/nm-platform.h2
3 files changed, 222 insertions, 82 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index d24d02765c..200cc42e77 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -435,7 +435,8 @@ typedef struct _NMDevicePrivate {
IpState ip6_state_;
};
NMIP6Config * con_ip6_config; /* config from the setting */
- NMIP6Config * wwan_ip6_config;
+ AppliedConfig wwan_ip6_config;
+ AppliedConfig ac_ip6_config; /* config from IPv6 autoconfiguration */
NMIP6Config * ext_ip6_config; /* Stuff added outside NM */
NMIP6Config * ext_ip6_config_captured; /* Configuration captured from platform. */
GSList * vpn6_configs; /* VPNs which use this device */
@@ -448,8 +449,6 @@ typedef struct _NMDevicePrivate {
gulong ndisc_changed_id;
gulong ndisc_timeout_id;
NMSettingIP6ConfigPrivacy ndisc_use_tempaddr;
- /* IP6 config from autoconf */
- NMIP6Config * ac_ip6_config;
guint linklocal6_timeout_id;
guint8 linklocal6_dad_counter;
@@ -463,7 +462,7 @@ typedef struct _NMDevicePrivate {
gulong prefix_sigid;
NMDhcp6Config * config;
/* IP6 config from DHCP */
- NMIP6Config * ip6_config;
+ AppliedConfig ip6_config;
/* Event ID of the current IP6 config from DHCP */
char * event_id;
guint restart_id;
@@ -701,6 +700,16 @@ _ip6_config_new (NMDevice *self)
nm_device_get_ip_ifindex (self));
}
+static NMIPConfig *
+_ip_config_new (NMDevice *self, int addr_family)
+{
+ nm_assert_addr_family (addr_family);
+
+ return addr_family == AF_INET
+ ? (gpointer) _ip4_config_new (self)
+ : (gpointer) _ip6_config_new (self);
+}
+
static void
applied_config_clear (AppliedConfig *config)
{
@@ -716,12 +725,80 @@ applied_config_init (AppliedConfig *config, gpointer ip_config)
config->orig = ip_config;
}
+static void
+applied_config_init_new (AppliedConfig *config, NMDevice *self, int addr_family)
+{
+ gs_unref_object NMIPConfig *c = _ip_config_new (self, addr_family);
+
+ applied_config_init (config, c);
+}
+
static NMIPConfig *
applied_config_get_current (AppliedConfig *config)
{
return config->current ?: config->orig;
}
+static void
+applied_config_add_address (AppliedConfig *config, const NMPlatformIPAddress *address)
+{
+ if (config->orig)
+ nm_ip_config_add_address (config->orig, address);
+ else
+ nm_assert (!config->current);
+
+ if (config->current)
+ nm_ip_config_add_address (config->current, address);
+}
+
+static void
+applied_config_add_nameserver (AppliedConfig *config, const NMIPAddr *ns)
+{
+ if (config->orig)
+ nm_ip_config_add_nameserver (config->orig, ns);
+ else
+ nm_assert (!config->current);
+
+ if (config->current)
+ nm_ip_config_add_nameserver (config->current, ns);
+}
+
+static void
+applied_config_add_search (AppliedConfig *config, const char *new)
+{
+ if (config->orig)
+ nm_ip_config_add_search (config->orig, new);
+ else
+ nm_assert (!config->current);
+
+ if (config->current)
+ nm_ip_config_add_search (config->current, new);
+}
+
+static void
+applied_config_reset_searches (AppliedConfig *config)
+{
+ if (config->orig)
+ nm_ip_config_reset_searches (config->orig);
+ else
+ nm_assert (!config->current);
+
+ if (config->current)
+ nm_ip_config_reset_searches (config->current);
+}
+
+static void
+applied_config_reset_nameservers (AppliedConfig *config)
+{
+ if (config->orig)
+ nm_ip_config_reset_nameservers (config->orig);
+ else
+ nm_assert (!config->current);
+
+ if (config->current)
+ nm_ip_config_reset_nameservers (config->current);
+}
+
/*****************************************************************************/
NM_UTILS_LOOKUP_STR_DEFINE_STATIC (_sys_iface_state_to_str, NMDeviceSysIfaceState,
@@ -6474,7 +6551,7 @@ dhcp6_cleanup (NMDevice *self, CleanupType cleanup_type, gboolean release)
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
priv->dhcp6.mode = NM_NDISC_DHCP_LEVEL_NONE;
- g_clear_object (&priv->dhcp6.ip6_config);
+ applied_config_clear (&priv->dhcp6.ip6_config);
g_clear_pointer (&priv->dhcp6.event_id, g_free);
nm_clear_g_source (&priv->dhcp6.restart_id);
@@ -6504,7 +6581,7 @@ ip6_config_merge_and_apply (NMDevice *self,
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
NMConnection *connection;
gboolean success;
- NMIP6Config *composite;
+ NMIP6Config *composite, *config;
gboolean ignore_auto_routes = FALSE;
gboolean ignore_auto_dns = FALSE;
gboolean ignore_default_routes = FALSE;
@@ -6552,15 +6629,18 @@ ip6_config_merge_and_apply (NMDevice *self,
priv->default_route_metric_penalty_ip6_has = default_route_metric_penalty_detect (self);
/* Merge all the IP configs into the composite config */
- if (priv->ac_ip6_config) {
- nm_ip6_config_merge (composite, priv->ac_ip6_config,
+ config = (NMIP6Config *) applied_config_get_current (&priv->ac_ip6_config);
+ if (config) {
+ nm_ip6_config_merge (composite, config,
(ignore_auto_routes ? NM_IP_CONFIG_MERGE_NO_ROUTES : 0)
| (ignore_default_routes ? NM_IP_CONFIG_MERGE_NO_DEFAULT_ROUTES : 0)
| (ignore_auto_dns ? NM_IP_CONFIG_MERGE_NO_DNS : 0),
default_route_metric_penalty_get (self, AF_INET6));
}
- if (priv->dhcp6.ip6_config) {
- nm_ip6_config_merge (composite, priv->dhcp6.ip6_config,
+
+ config = (NMIP6Config *) applied_config_get_current (&priv->dhcp6.ip6_config);
+ if (config) {
+ nm_ip6_config_merge (composite, config,
(ignore_auto_routes ? NM_IP_CONFIG_MERGE_NO_ROUTES : 0)
| (ignore_default_routes ? NM_IP_CONFIG_MERGE_NO_DEFAULT_ROUTES : 0)
| (ignore_auto_dns ? NM_IP_CONFIG_MERGE_NO_DNS : 0),
@@ -6576,8 +6656,9 @@ ip6_config_merge_and_apply (NMDevice *self,
/* Merge WWAN config *last* to ensure modem-given settings overwrite
* any external stuff set by pppd or other scripts.
*/
- if (priv->wwan_ip6_config) {
- nm_ip6_config_merge (composite, priv->wwan_ip6_config,
+ config = (NMIP6Config *) applied_config_get_current (&priv->wwan_ip6_config);
+ if (config) {
+ nm_ip6_config_merge (composite, config,
(ignore_auto_routes ? NM_IP_CONFIG_MERGE_NO_ROUTES : 0)
| (ignore_default_routes ? NM_IP_CONFIG_MERGE_NO_DEFAULT_ROUTES : 0)
| (ignore_auto_dns ? NM_IP_CONFIG_MERGE_NO_DNS : 0),
@@ -6633,7 +6714,7 @@ dhcp6_lease_change (NMDevice *self)
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
NMSettingsConnection *settings_connection;
- if (priv->dhcp6.ip6_config == NULL) {
+ if (!applied_config_get_current (&priv->dhcp6.ip6_config)) {
_LOGW (LOGD_DHCP6, "failed to get DHCPv6 config for rebind");
return FALSE;
}
@@ -6797,22 +6878,22 @@ dhcp6_state_changed (NMDhcpClient *client,
const NMPlatformIP6Address *a;
nm_ip_config_iter_ip6_address_for_each (&ipconf_iter, ip6_config, &a)
- nm_ip6_config_add_address (priv->dhcp6.ip6_config, a);
+ applied_config_add_address (&priv->dhcp6.ip6_config, NM_PLATFORM_IP_ADDRESS_CAST (a));
} else {
- g_clear_object (&priv->dhcp6.ip6_config);
g_clear_pointer (&priv->dhcp6.event_id, g_free);
if (ip6_config) {
- priv->dhcp6.ip6_config = g_object_ref (ip6_config);
+ applied_config_init (&priv->dhcp6.ip6_config, ip6_config);
priv->dhcp6.event_id = g_strdup (event_id);
nm_dhcp6_config_set_options (priv->dhcp6.config, options);
_notify (self, PROP_DHCP6_CONFIG);
- }
+ } else
+ applied_config_clear (&priv->dhcp6.ip6_config);
}
priv->dhcp6.num_tries_left = DHCP_NUM_TRIES_MAX;
if (priv->ip6_state == IP_CONF) {
- if (priv->dhcp6.ip6_config == NULL) {
+ if (!applied_config_get_current (&priv->dhcp6.ip6_config)) {
nm_device_ip_method_failed (self, AF_INET6, NM_DEVICE_STATE_REASON_DHCP_FAILED);
break;
}
@@ -6932,8 +7013,8 @@ dhcp6_start (NMDevice *self, gboolean wait_for_ll)
nm_exported_object_clear_and_unexport (&priv->dhcp6.config);
priv->dhcp6.config = nm_dhcp6_config_new ();
- g_warn_if_fail (priv->dhcp6.ip6_config == NULL);
- g_clear_object (&priv->dhcp6.ip6_config);
+ nm_assert (!applied_config_get_current (&priv->dhcp6.ip6_config));
+ applied_config_clear (&priv->dhcp6.ip6_config);
g_clear_pointer (&priv->dhcp6.event_id, g_free);
connection = nm_device_get_applied_connection (self);
@@ -7016,12 +7097,12 @@ nm_device_use_ip6_subnet (NMDevice *self, const NMPlatformIP6Address *subnet)
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
NMPlatformIP6Address address = *subnet;
- if (!priv->ac_ip6_config)
- priv->ac_ip6_config = _ip6_config_new (self);
+ if (!applied_config_get_current (&priv->ac_ip6_config))
+ applied_config_init_new (&priv->ac_ip6_config, self, AF_INET6);
/* Assign a ::1 address in the subnet for us. */
address.address.s6_addr32[3] |= htonl (1);
- nm_ip6_config_add_address (priv->ac_ip6_config, &address);
+ applied_config_add_address (&priv->ac_ip6_config, NM_PLATFORM_IP_ADDRESS_CAST (&address));
_LOGD (LOGD_IP6, "ipv6-pd: using %s address (preferred for %u seconds)",
nm_utils_inet6_ntop (&address.address, NULL),
@@ -7043,11 +7124,11 @@ nm_device_copy_ip6_dns_config (NMDevice *self, NMDevice *from_device)
NMIP6Config *from_config = NULL;
guint i, len;
- if (priv->ac_ip6_config) {
- nm_ip6_config_reset_nameservers (priv->ac_ip6_config);
- nm_ip6_config_reset_searches (priv->ac_ip6_config);
+ if (applied_config_get_current (&priv->ac_ip6_config)) {
+ applied_config_reset_nameservers (&priv->ac_ip6_config);
+ applied_config_reset_searches (&priv->ac_ip6_config);
} else
- priv->ac_ip6_config = _ip6_config_new (self);
+ applied_config_init_new (&priv->ac_ip6_config, self, AF_INET6);
if (from_device)
from_config = nm_device_get_ip6_config (from_device);
@@ -7056,14 +7137,14 @@ nm_device_copy_ip6_dns_config (NMDevice *self, NMDevice *from_device)
len = nm_ip6_config_get_num_nameservers (from_config);
for (i = 0; i < len; i++) {
- nm_ip6_config_add_nameserver (priv->ac_ip6_config,
- nm_ip6_config_get_nameserver (from_config, i));
+ applied_config_add_nameserver (&priv->ac_ip6_config,
+ (const NMIPAddr *) nm_ip6_config_get_nameserver (from_config, i));
}
len = nm_ip6_config_get_num_searches (from_config);
for (i = 0; i < len; i++) {
- nm_ip6_config_add_search (priv->ac_ip6_config,
- nm_ip6_config_get_search (from_config, i));
+ applied_config_add_search (&priv->ac_ip6_config,
+ nm_ip6_config_get_search (from_config, i));
}
if (!ip6_config_merge_and_apply (self, TRUE))
@@ -7503,8 +7584,8 @@ ndisc_config_changed (NMNDisc *ndisc, const NMNDiscData *rdata, guint changed_in
g_return_if_fail (priv->act_request);
- if (!priv->ac_ip6_config)
- priv->ac_ip6_config = _ip6_config_new (self);
+ if (!applied_config_get_current (&priv->ac_ip6_config))
+ applied_config_init_new (&priv->ac_ip6_config, self, AF_INET6);
if (changed & NM_NDISC_CONFIG_ADDRESSES) {
guint8 plen;
@@ -7525,16 +7606,23 @@ ndisc_config_changed (NMNDisc *ndisc, const NMNDiscData *rdata, guint changed_in
} else
plen = 128;
- nm_ip6_config_reset_addresses_ndisc (priv->ac_ip6_config,
+ nm_ip6_config_reset_addresses_ndisc ((NMIP6Config *) priv->ac_ip6_config.orig,
rdata->addresses,
rdata->addresses_n,
plen,
ifa_flags);
+ if (priv->ac_ip6_config.current) {
+ nm_ip6_config_reset_addresses_ndisc ((NMIP6Config *) priv->ac_ip6_config.current,
+ rdata->addresses,
+ rdata->addresses_n,
+ plen,
+ ifa_flags);
+ }
}
if (NM_FLAGS_ANY (changed, NM_NDISC_CONFIG_ROUTES
| NM_NDISC_CONFIG_GATEWAYS)) {
- nm_ip6_config_reset_routes_ndisc (priv->ac_ip6_config,
+ nm_ip6_config_reset_routes_ndisc ((NMIP6Config *) priv->ac_ip6_config.orig,
rdata->gateways,
rdata->gateways_n,
rdata->routes,
@@ -7543,22 +7631,34 @@ ndisc_config_changed (NMNDisc *ndisc, const NMNDiscData *rdata, guint changed_in
nm_device_get_route_metric (self, AF_INET6),
nm_platform_check_kernel_support (nm_device_get_platform (self),
NM_PLATFORM_KERNEL_SUPPORT_RTA_PREF));
+ if (priv->ac_ip6_config.current) {
+ nm_ip6_config_reset_routes_ndisc ((NMIP6Config *) priv->ac_ip6_config.current,
+ rdata->gateways,
+ rdata->gateways_n,
+ rdata->routes,
+ rdata->routes_n,
+ nm_device_get_route_table (self, AF_INET6, TRUE),
+ nm_device_get_route_metric (self, AF_INET6),
+ nm_platform_check_kernel_support (nm_device_get_platform (self),
+ NM_PLATFORM_KERNEL_SUPPORT_RTA_PREF));
+ }
+
}
if (changed & NM_NDISC_CONFIG_DNS_SERVERS) {
/* Rebuild DNS server list from neighbor discovery cache. */
- nm_ip6_config_reset_nameservers (priv->ac_ip6_config);
+ applied_config_reset_nameservers (&priv->ac_ip6_config);
for (i = 0; i < rdata->dns_servers_n; i++)
- nm_ip6_config_add_nameserver (priv->ac_ip6_config, &rdata->dns_servers[i].address);
+ applied_config_add_nameserver (&priv->ac_ip6_config, (const NMIPAddr *) &rdata->dns_servers[i].address);
}
if (changed & NM_NDISC_CONFIG_DNS_DOMAINS) {
/* Rebuild domain list from neighbor discovery cache. */
- nm_ip6_config_reset_searches (priv->ac_ip6_config);
+ applied_config_reset_searches (&priv->ac_ip6_config);
for (i = 0; i < rdata->dns_domains_n; i++)
- nm_ip6_config_add_search (priv->ac_ip6_config, rdata->dns_domains[i].domain);
+ applied_config_add_search (&priv->ac_ip6_config, rdata->dns_domains[i].domain);
}
if (changed & NM_NDISC_CONFIG_DHCP_LEVEL) {
@@ -7703,11 +7803,8 @@ addrconf6_start (NMDevice *self, NMSettingIP6ConfigPrivacy use_tempaddr)
connection = nm_device_get_applied_connection (self);
g_assert (connection);
- g_warn_if_fail (priv->ac_ip6_config == NULL);
- if (priv->ac_ip6_config) {
- g_object_unref (priv->ac_ip6_config);
- priv->ac_ip6_config = NULL;
- }
+ nm_assert (!applied_config_get_current (&priv->ac_ip6_config));
+ applied_config_clear (&priv->ac_ip6_config);
g_clear_pointer (&priv->rt6_temporary_not_available, g_hash_table_unref);
nm_clear_g_source (&priv->rt6_temporary_not_available_id);
@@ -7765,7 +7862,7 @@ addrconf6_cleanup (NMDevice *self)
nm_device_remove_pending_action (self, NM_PENDING_ACTION_AUTOCONF6, FALSE);
- g_clear_object (&priv->ac_ip6_config);
+ applied_config_clear (&priv->ac_ip6_config);
g_clear_pointer (&priv->rt6_temporary_not_available, g_hash_table_unref);
nm_clear_g_source (&priv->rt6_temporary_not_available_id);
g_clear_object (&priv->ndisc);
@@ -8145,8 +8242,8 @@ nm_device_activate_stage3_ip6_start (NMDevice *self)
/* Here we get a static IPv6 config, like for Shared where it's
* autogenerated or from modems where it comes from ModemManager.
*/
- g_warn_if_fail (priv->ac_ip6_config == NULL);
- priv->ac_ip6_config = ip6_config;
+ nm_assert (!applied_config_get_current (&priv->ac_ip6_config));
+ applied_config_init (&priv->ac_ip6_config, ip6_config);
nm_device_activate_schedule_ip6_config_result (self);
} else if (ret == NM_ACT_STAGE_RETURN_IP_DONE) {
_set_ip_state (self, AF_INET6, IP_DONE);
@@ -8686,10 +8783,10 @@ static NMIP6Config *
dad6_get_pending_addresses (NMDevice *self)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
- NMIP6Config *confs[] = { priv->ac_ip6_config,
- priv->dhcp6.ip6_config,
+ NMIP6Config *confs[] = { (NMIP6Config *) applied_config_get_current (&priv->ac_ip6_config),
+ (NMIP6Config *) applied_config_get_current (&priv->dhcp6.ip6_config),
priv->con_ip6_config,
- priv->wwan_ip6_config };
+ (NMIP6Config *) applied_config_get_current (&priv->wwan_ip6_config) };
const NMPlatformIP6Address *addr, *pl_addr;
NMIP6Config *dad6_config = NULL;
NMDedupMultiIter ipconf_iter;
@@ -8756,7 +8853,7 @@ activate_stage5_ip6_config_commit (NMDevice *self)
if (ip6_config_merge_and_apply (self, TRUE)) {
if ( priv->dhcp6.mode != NM_NDISC_DHCP_LEVEL_NONE
&& priv->ip6_state == IP_CONF) {
- if (priv->dhcp6.ip6_config) {
+ if (applied_config_get_current (&priv->dhcp6.ip6_config)) {
/* If IPv6 wasn't the first IP to complete, and DHCP was used,
* then ensure dispatcher scripts get the DHCP lease information.
*/
@@ -9171,6 +9268,9 @@ nm_device_reactivate_ip6_config (NMDevice *self,
if (priv->ip6_state != IP_NONE) {
g_clear_object (&priv->con_ip6_config);
g_clear_object (&priv->ext_ip6_config);
+ g_clear_object (&priv->ac_ip6_config.current);
+ g_clear_object (&priv->dhcp6.ip6_config.current);
+ g_clear_object (&priv->wwan_ip6_config.current);
priv->con_ip6_config = _ip6_config_new (self);
nm_ip6_config_merge_setting (priv->con_ip6_config,
s_ip6_new,
@@ -10402,14 +10502,7 @@ nm_device_set_wwan_ip6_config (NMDevice *self, NMIP6Config *config)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
- if (priv->wwan_ip6_config == config)
- return;
-
- g_clear_object (&priv->wwan_ip6_config);
- if (config)
- priv->wwan_ip6_config = g_object_ref (config);
-
- /* NULL to use existing configs */
+ applied_config_init (&priv->wwan_ip6_config, config);
if (!ip6_config_merge_and_apply (self, TRUE))
_LOGW (LOGD_IP6, "failed to set WWAN IPv6 configuration");
}
@@ -11108,18 +11201,11 @@ update_ext_ip_config (NMDevice *self, int addr_family, gboolean initial, gboolea
nm_ip6_config_intersect (priv->con_ip6_config, priv->ext_ip6_config,
default_route_metric_penalty_get (self, AF_INET6));
}
- if (priv->ac_ip6_config) {
- nm_ip6_config_intersect (priv->ac_ip6_config, priv->ext_ip6_config,
- default_route_metric_penalty_get (self, AF_INET6));
- }
- if (priv->dhcp6.ip6_config) {
- nm_ip6_config_intersect (priv->dhcp6.ip6_config, priv->ext_ip6_config,
- default_route_metric_penalty_get (self, AF_INET6));
- }
- if (priv->wwan_ip6_config) {
- nm_ip6_config_intersect (priv->wwan_ip6_config, priv->ext_ip6_config,
- default_route_metric_penalty_get (self, AF_INET6));
- }
+
+ intersect_ext_config (self, &priv->ac_ip6_config);
+ intersect_ext_config (self, &priv->dhcp6.ip6_config);
+ intersect_ext_config (self, &priv->wwan_ip6_config);
+
for (iter = priv->vpn6_configs; iter; iter = iter->next)
nm_ip6_config_intersect (iter->data, priv->ext_ip6_config, 0);
}
@@ -11131,17 +11217,20 @@ update_ext_ip_config (NMDevice *self, int addr_family, gboolean initial, gboolea
nm_ip6_config_subtract (priv->ext_ip6_config, priv->con_ip6_config,
default_route_metric_penalty_get (self, AF_INET6));
}
- if (priv->ac_ip6_config) {
- nm_ip6_config_subtract (priv->ext_ip6_config, priv->ac_ip6_config,
- default_route_metric_penalty_get (self, AF_INET6));
+ if (applied_config_get_current (&priv->ac_ip6_config)) {
+ nm_ip_config_subtract ((NMIPConfig *) priv->ext_ip6_config,
+ applied_config_get_current (&priv->ac_ip6_config),
+ default_route_metric_penalty_get (self, AF_INET6));
}
- if (priv->dhcp6.ip6_config) {
- nm_ip6_config_subtract (priv->ext_ip6_config, priv->dhcp6.ip6_config,
- default_route_metric_penalty_get (self, AF_INET6));
+ if (applied_config_get_current (&priv->dhcp6.ip6_config)) {
+ nm_ip_config_subtract ((NMIPConfig *) priv->ext_ip6_config,
+ applied_config_get_current (&priv->dhcp6.ip6_config),
+ default_route_metric_penalty_get (self, AF_INET6));
}
- if (priv->wwan_ip6_config) {
- nm_ip6_config_subtract (priv->ext_ip6_config, priv->wwan_ip6_config,
- default_route_metric_penalty_get (self, AF_INET6));
+ if (applied_config_get_current (&priv->wwan_ip6_config)) {
+ nm_ip_config_subtract ((NMIPConfig *) priv->ext_ip6_config,
+ applied_config_get_current (&priv->wwan_ip6_config),
+ default_route_metric_penalty_get (self, AF_INET6));
}
for (iter = priv->vpn6_configs; iter; iter = iter->next)
nm_ip6_config_subtract (priv->ext_ip6_config, iter->data, 0);
@@ -12479,10 +12568,10 @@ _cleanup_generic_post (NMDevice *self, CleanupType cleanup_type)
g_clear_object (&priv->ext_ip4_config);
g_clear_object (&priv->ip4_config);
g_clear_object (&priv->con_ip6_config);
- g_clear_object (&priv->ac_ip6_config);
+ applied_config_clear (&priv->ac_ip6_config);
g_clear_object (&priv->ext_ip6_config);
g_clear_object (&priv->ext_ip6_config_captured);
- g_clear_object (&priv->wwan_ip6_config);
+ applied_config_clear (&priv->wwan_ip6_config);
g_clear_object (&priv->ip6_config);
g_clear_object (&priv->dad6_ip6_config);
diff --git a/src/nm-ip4-config.h b/src/nm-ip4-config.h
index c614863d03..59581b87bd 100644
--- a/src/nm-ip4-config.h
+++ b/src/nm-ip4-config.h
@@ -222,6 +222,13 @@ const NMPlatformIP4Route *nm_ip4_config_get_direct_route_for_host (const NMIP4Co
void nm_ip4_config_reset_nameservers (NMIP4Config *self);
void nm_ip4_config_add_nameserver (NMIP4Config *self, guint32 nameserver);
+
+static inline void
+_nm_ip4_config_add_nameserver (NMIP4Config *self, const guint32 *nameserver)
+{
+ nm_ip4_config_add_nameserver (self, *nameserver);
+}
+
void nm_ip4_config_del_nameserver (NMIP4Config *self, guint i);
guint nm_ip4_config_get_num_nameservers (const NMIP4Config *self);
guint32 nm_ip4_config_get_nameserver (const NMIP4Config *self, guint i);
@@ -354,12 +361,42 @@ nm_ip_config_get_addr_family (const NMIPConfig *config)
} \
} G_STMT_END
+#define _NM_IP_CONFIG_DISPATCH_VOID(config, v4_func, v6_func, ...) \
+ G_STMT_START { \
+ gconstpointer _config = (config); \
+ \
+ if (NM_IS_IP4_CONFIG (_config)) { \
+ v4_func ((NMIP4Config *) _config, ##__VA_ARGS__); \
+ } else { \
+ nm_assert (NM_IS_IP6_CONFIG (_config)); \
+ v6_func ((NMIP6Config *) _config, ##__VA_ARGS__); \
+ } \
+ } G_STMT_END
+
+static inline void
+nm_ip_config_add_address (NMIPConfig *self, const NMPlatformIPAddress *address)
+{
+ _NM_IP_CONFIG_DISPATCH_VOID (self, nm_ip4_config_add_address, nm_ip6_config_add_address, (gconstpointer) address);
+}
+
static inline int
nm_ip_config_get_dns_priority (const NMIPConfig *self)
{
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_dns_priority, nm_ip6_config_get_dns_priority);
}
+static inline void
+nm_ip_config_add_nameserver (NMIPConfig *self, const NMIPAddr *ns)
+{
+ _NM_IP_CONFIG_DISPATCH_VOID (self, _nm_ip4_config_add_nameserver, nm_ip6_config_add_nameserver, (gconstpointer) ns);
+}
+
+static inline void
+nm_ip_config_reset_nameservers (const NMIPConfig *self)
+{
+ _NM_IP_CONFIG_DISPATCH_VOID (self, nm_ip4_config_reset_nameservers, nm_ip6_config_reset_nameservers);
+}
+
static inline guint
nm_ip_config_get_num_nameservers (const NMIPConfig *self)
{
@@ -384,6 +421,18 @@ nm_ip_config_get_domain (const NMIPConfig *self, guint i)
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_domain, nm_ip6_config_get_domain, i);
}
+static inline void
+nm_ip_config_reset_searches (const NMIPConfig *self)
+{
+ _NM_IP_CONFIG_DISPATCH_VOID (self, nm_ip4_config_reset_searches, nm_ip6_config_reset_searches);
+}
+
+static inline void
+nm_ip_config_add_search (const NMIPConfig *self, const char *new)
+{
+ _NM_IP_CONFIG_DISPATCH_VOID (self, nm_ip4_config_add_search, nm_ip6_config_add_search, new);
+}
+
static inline guint
nm_ip_config_get_num_searches (const NMIPConfig *self)
{
diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h
index 3336642b8b..bd2e4516fb 100644
--- a/src/platform/nm-platform.h
+++ b/src/platform/nm-platform.h
@@ -252,6 +252,8 @@ struct _NMPlatformObject {
__NMPlatformObject_COMMON;
};
+#define NM_PLATFORM_IP_ADDRESS_CAST(address) \
+ NM_CONSTCAST (NMPlatformIPAddress, (address), NMPlatformIPXAddress, NMPlatformIP4Address, NMPlatformIP6Address)
#define __NMPlatformIPAddress_COMMON \
__NMPlatformObject_COMMON; \