mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-02-14 14:30:36 +01:00
core: add intersect() functions to NMIP?Config
This commit is contained in:
parent
92d800b2e3
commit
49d700e862
4 changed files with 154 additions and 0 deletions
|
|
@ -740,6 +740,88 @@ nm_ip4_config_subtract (NMIP4Config *dst, const NMIP4Config *src)
|
|||
g_object_thaw_notify (G_OBJECT (dst));
|
||||
}
|
||||
|
||||
void
|
||||
nm_ip4_config_intersect (NMIP4Config *dst, const NMIP4Config *src)
|
||||
{
|
||||
guint32 i;
|
||||
gint idx;
|
||||
|
||||
g_return_if_fail (src != NULL);
|
||||
g_return_if_fail (dst != NULL);
|
||||
|
||||
g_object_freeze_notify (G_OBJECT (dst));
|
||||
|
||||
/* addresses */
|
||||
for (i = 0; i < nm_ip4_config_get_num_addresses (dst); ) {
|
||||
idx = _addresses_get_index (src, nm_ip4_config_get_address (dst, i));
|
||||
if (idx < 0)
|
||||
nm_ip4_config_del_address (dst, i);
|
||||
else
|
||||
i++;
|
||||
}
|
||||
|
||||
/* nameservers */
|
||||
for (i = 0; i < nm_ip4_config_get_num_nameservers (dst); ) {
|
||||
idx = _nameservers_get_index (src, nm_ip4_config_get_nameserver (dst, i));
|
||||
if (idx < 0)
|
||||
nm_ip4_config_del_nameserver (dst, i);
|
||||
else
|
||||
i++;
|
||||
}
|
||||
|
||||
/* default gateway */
|
||||
if ( !nm_ip4_config_get_num_addresses (dst)
|
||||
|| (nm_ip4_config_get_gateway (src) != nm_ip4_config_get_gateway (dst)))
|
||||
nm_ip4_config_set_gateway (dst, 0);
|
||||
|
||||
/* routes */
|
||||
for (i = 0; i < nm_ip4_config_get_num_routes (dst); ) {
|
||||
idx = _routes_get_index (src, nm_ip4_config_get_route (dst, i));
|
||||
if (idx < 0)
|
||||
nm_ip4_config_del_route (dst, i);
|
||||
else
|
||||
i++;
|
||||
}
|
||||
|
||||
/* domains */
|
||||
for (i = 0; i < nm_ip4_config_get_num_domains (dst); ) {
|
||||
idx = _domains_get_index (src, nm_ip4_config_get_domain (dst, i));
|
||||
if (idx < 0)
|
||||
nm_ip4_config_del_domain (dst, i);
|
||||
else
|
||||
i++;
|
||||
}
|
||||
|
||||
/* dns searches */
|
||||
for (i = 0; i < nm_ip4_config_get_num_searches (dst); ) {
|
||||
idx = _searches_get_index (src, nm_ip4_config_get_search (dst, i));
|
||||
if (idx < 0)
|
||||
nm_ip4_config_del_search (dst, i);
|
||||
else
|
||||
i++;
|
||||
}
|
||||
|
||||
/* NIS */
|
||||
for (i = 0; i < nm_ip4_config_get_num_nis_servers (dst); ) {
|
||||
idx = _nis_servers_get_index (src, nm_ip4_config_get_nis_server (dst, i));
|
||||
if (idx < 0)
|
||||
nm_ip4_config_del_nis_server (dst, i);
|
||||
else
|
||||
i++;
|
||||
}
|
||||
|
||||
/* WINS */
|
||||
for (i = 0; i < nm_ip4_config_get_num_wins (dst); ) {
|
||||
idx = _wins_get_index (src, nm_ip4_config_get_wins (dst, i));
|
||||
if (idx < 0)
|
||||
nm_ip4_config_del_wins (dst, i);
|
||||
else
|
||||
i++;
|
||||
}
|
||||
|
||||
g_object_thaw_notify (G_OBJECT (dst));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* nm_ip4_config_replace:
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@ NMSetting *nm_ip4_config_create_setting (const NMIP4Config *config);
|
|||
/* Utility functions */
|
||||
void nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src);
|
||||
void nm_ip4_config_subtract (NMIP4Config *dst, const NMIP4Config *src);
|
||||
void nm_ip4_config_intersect (NMIP4Config *dst, const NMIP4Config *src);
|
||||
gboolean nm_ip4_config_replace (NMIP4Config *dst, const NMIP4Config *src, gboolean *relevant_changes);
|
||||
gboolean nm_ip4_config_destination_is_direct (const NMIP4Config *config, guint32 dest, int plen);
|
||||
void nm_ip4_config_dump (const NMIP4Config *config, const char *detail);
|
||||
|
|
|
|||
|
|
@ -801,6 +801,76 @@ nm_ip6_config_subtract (NMIP6Config *dst, const NMIP6Config *src)
|
|||
g_object_thaw_notify (G_OBJECT (dst));
|
||||
}
|
||||
|
||||
void
|
||||
nm_ip6_config_intersect (NMIP6Config *dst, const NMIP6Config *src)
|
||||
{
|
||||
guint i;
|
||||
gint idx;
|
||||
const struct in6_addr *dst_tmp, *src_tmp;
|
||||
|
||||
g_return_if_fail (src != NULL);
|
||||
g_return_if_fail (dst != NULL);
|
||||
|
||||
g_object_freeze_notify (G_OBJECT (dst));
|
||||
|
||||
/* addresses */
|
||||
for (i = 0; i < nm_ip6_config_get_num_addresses (dst); ) {
|
||||
idx = _addresses_get_index (src, nm_ip6_config_get_address (dst, i));
|
||||
if (idx < 0)
|
||||
nm_ip6_config_del_address (dst, i);
|
||||
else
|
||||
i++;
|
||||
}
|
||||
|
||||
/* nameservers */
|
||||
for (i = 0; i < nm_ip6_config_get_num_nameservers (dst); ) {
|
||||
idx = _nameservers_get_index (src, nm_ip6_config_get_nameserver (dst, i));
|
||||
if (idx < 0)
|
||||
nm_ip6_config_del_nameserver (dst, i);
|
||||
else
|
||||
i++;
|
||||
}
|
||||
|
||||
/* default gateway */
|
||||
dst_tmp = nm_ip6_config_get_gateway (dst);
|
||||
if (dst_tmp) {
|
||||
src_tmp = nm_ip6_config_get_gateway (src);
|
||||
if ( !nm_ip6_config_get_num_addresses (dst)
|
||||
|| !src_tmp
|
||||
|| !IN6_ARE_ADDR_EQUAL (src_tmp, dst_tmp))
|
||||
nm_ip6_config_set_gateway (dst, NULL);
|
||||
}
|
||||
|
||||
/* routes */
|
||||
for (i = 0; i < nm_ip6_config_get_num_routes (dst); ) {
|
||||
idx = _routes_get_index (src, nm_ip6_config_get_route (dst, i));
|
||||
if (idx < 0)
|
||||
nm_ip6_config_del_route (dst, i);
|
||||
else
|
||||
i++;
|
||||
}
|
||||
|
||||
/* domains */
|
||||
for (i = 0; i < nm_ip6_config_get_num_domains (src); ) {
|
||||
idx = _domains_get_index (src, nm_ip6_config_get_domain (dst, i));
|
||||
if (idx < 0)
|
||||
nm_ip6_config_del_domain (dst, i);
|
||||
else
|
||||
i++;
|
||||
}
|
||||
|
||||
/* dns searches */
|
||||
for (i = 0; i < nm_ip6_config_get_num_searches (src); i++) {
|
||||
idx = _searches_get_index (src, nm_ip6_config_get_search (dst, i));
|
||||
if (idx < 0)
|
||||
nm_ip6_config_del_search (dst, i);
|
||||
else
|
||||
i++;
|
||||
}
|
||||
|
||||
g_object_thaw_notify (G_OBJECT (dst));
|
||||
}
|
||||
|
||||
/**
|
||||
* nm_ip6_config_replace:
|
||||
* @dst: config which will be replaced with everything in @src
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@ NMSetting *nm_ip6_config_create_setting (const NMIP6Config *config);
|
|||
/* Utility functions */
|
||||
void nm_ip6_config_merge (NMIP6Config *dst, const NMIP6Config *src);
|
||||
void nm_ip6_config_subtract (NMIP6Config *dst, const NMIP6Config *src);
|
||||
void nm_ip6_config_intersect (NMIP6Config *dst, const NMIP6Config *src);
|
||||
gboolean nm_ip6_config_replace (NMIP6Config *dst, const NMIP6Config *src, gboolean *relevant_changes);
|
||||
int nm_ip6_config_destination_is_direct (const NMIP6Config *config, const struct in6_addr *dest, int plen);
|
||||
void nm_ip6_config_dump (const NMIP6Config *config, const char *detail);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue