summaryrefslogtreecommitdiff
path: root/src/nm-ip6-config.c
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2019-03-08 15:50:39 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2019-03-11 10:31:29 +0100
commite09674280994919068afe766b991108a89cb75e5 (patch)
tree946dd74e91199fbb84be51783ebaae85d3260e57 /src/nm-ip6-config.c
parent058bf25ac4db3c9118c844d29cefa9dad3414a0f (diff)
downloadNetworkManager-e09674280994919068afe766b991108a89cb75e5.tar.gz
core: allow ignoring addresses when intersecting ip configs
Add a new argument to nm_ip_config_* helpers to also ignore addresses similarly to what we already do for routes. This will be used in the next commit; no change in behavior here. (cherry picked from commit 39b72572087a1243725a48d47d53131591417aec)
Diffstat (limited to 'src/nm-ip6-config.c')
-rw-r--r--src/nm-ip6-config.c63
1 files changed, 42 insertions, 21 deletions
diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c
index d63968cf0d..99a9ff8886 100644
--- a/src/nm-ip6-config.c
+++ b/src/nm-ip6-config.c
@@ -1086,6 +1086,7 @@ nm_ip6_config_subtract (NMIP6Config *dst,
static gboolean
_nm_ip6_config_intersect_helper (NMIP6Config *dst,
const NMIP6Config *src,
+ gboolean intersect_addresses,
gboolean intersect_routes,
guint32 default_route_metric_penalty,
gboolean update_dst)
@@ -1108,24 +1109,26 @@ _nm_ip6_config_intersect_helper (NMIP6Config *dst,
g_object_freeze_notify (G_OBJECT (dst));
/* addresses */
- changed = FALSE;
- nm_ip_config_iter_ip6_address_for_each (&ipconf_iter, dst, &a) {
- if (nm_dedup_multi_index_lookup_obj (src_priv->multi_idx,
- &src_priv->idx_ip6_addresses,
- NMP_OBJECT_UP_CAST (a)))
- continue;
+ if (intersect_addresses) {
+ changed = FALSE;
+ nm_ip_config_iter_ip6_address_for_each (&ipconf_iter, dst, &a) {
+ if (nm_dedup_multi_index_lookup_obj (src_priv->multi_idx,
+ &src_priv->idx_ip6_addresses,
+ NMP_OBJECT_UP_CAST (a)))
+ continue;
- if (!update_dst)
- return TRUE;
+ if (!update_dst)
+ return TRUE;
- if (nm_dedup_multi_index_remove_entry (dst_priv->multi_idx,
- ipconf_iter.current) != 1)
- nm_assert_not_reached ();
- changed = TRUE;
- }
- if (changed) {
- _notify_addresses (dst);
- result = TRUE;
+ if (nm_dedup_multi_index_remove_entry (dst_priv->multi_idx,
+ ipconf_iter.current) != 1)
+ nm_assert_not_reached ();
+ changed = TRUE;
+ }
+ if (changed) {
+ _notify_addresses (dst);
+ result = TRUE;
+ }
}
/* ignore nameservers */
@@ -1193,6 +1196,8 @@ skip_routes:
* nm_ip6_config_intersect:
* @dst: a configuration to be updated
* @src: another configuration
+ * @intersect_addresses: whether addresses should be intersected
+ * @intersect_routes: whether routes should be intersected
* @default_route_metric_penalty: the default route metric penalty
*
* Computes the intersection between @src and @dst and updates @dst in place
@@ -1201,16 +1206,24 @@ skip_routes:
void
nm_ip6_config_intersect (NMIP6Config *dst,
const NMIP6Config *src,
+ gboolean intersect_addresses,
gboolean intersect_routes,
guint32 default_route_metric_penalty)
{
- _nm_ip6_config_intersect_helper (dst, src, intersect_routes, default_route_metric_penalty, TRUE);
+ _nm_ip6_config_intersect_helper (dst,
+ src,
+ intersect_addresses,
+ intersect_routes,
+ default_route_metric_penalty,
+ TRUE);
}
/**
* nm_ip6_config_intersect_alloc:
* @a: a configuration
* @b: another configuration
+ * @intersect_addresses: whether addresses should be intersected
+ * @intersect_routes: whether routes should be intersected
* @default_route_metric_penalty: the default route metric penalty
*
* Computes the intersection between @a and @b and returns the result in a newly
@@ -1225,17 +1238,25 @@ nm_ip6_config_intersect (NMIP6Config *dst,
NMIP6Config *
nm_ip6_config_intersect_alloc (const NMIP6Config *a,
const NMIP6Config *b,
+ gboolean intersect_addresses,
gboolean intersect_routes,
guint32 default_route_metric_penalty)
{
NMIP6Config *a_copy;
- if (_nm_ip6_config_intersect_helper ((NMIP6Config *) a, b,
+ if (_nm_ip6_config_intersect_helper ((NMIP6Config *) a,
+ b,
+ intersect_addresses,
intersect_routes,
- default_route_metric_penalty, FALSE)) {
+ default_route_metric_penalty,
+ FALSE)) {
a_copy = nm_ip6_config_clone (a);
- _nm_ip6_config_intersect_helper (a_copy, b, intersect_routes,
- default_route_metric_penalty, TRUE);
+ _nm_ip6_config_intersect_helper (a_copy,
+ b,
+ intersect_addresses,
+ intersect_routes,
+ default_route_metric_penalty,
+ TRUE);
return a_copy;
} else
return NULL;