2008-09-18 Dan Williams <dcbw@redhat.com>
Implement support for honoring configured and automatic hostnames, and for
setting the configured hostname.
* introspection/nm-ip4-config.xml
src/nm-ip4-config.c
src/nm-ip4-config.h
src/dhcp-manager/nm-dhcp-manager.c
- Remove useless hostname property; it's not really part of the IPv4
config
* introspection/nm-settings-system.xml
libnm-glib/nm-dbus-settings-system.c
libnm-glib/nm-dbus-settings-system.h
- Add SetHostname() call to system settings D-Bus interface
- Add Hostname property to system settings D-Bus interface
- (nm_dbus_settings_system_save_hostname,
nm_dbus_settings_system_get_hostname): implement
* src/nm-device.c
src/nm-device.h
- (nm_device_get_dhcp4_config): implement
* src/nm-manager.c
src/nm-manager.h
- Fetch and track system settings service hostname changes, and proxy
the changes via a GObject property of the manager
* system-settings/src/nm-system-config-interface.c
system-settings/src/nm-system-config-interface.h
- Replace nm_system_config_interface_supports_add() with a capabilities
bitfield
* system-settings/src/nm-system-config-error.c
system-settings/src/nm-system-config-error.h
- Add additional errors
* system-settings/src/dbus-settings.c
system-settings/src/dbus-settings.h
- (get_property, nm_sysconfig_settings_class_init): add hostname
property; first plugin returning a hostname wins
- (impl_settings_add_connection): use plugin capabilities instead of
nm_system_config_interface_supports_add()
- (impl_settings_save_hostname): implement hostname saving
* src/NetworkManagerPolicy.c
- (lookup_thread_run_cb, lookup_thread_worker, lookup_thread_new,
lookup_thread_die): implement an asynchronous hostname lookup thread
which given an IPv4 address tries to look up the hostname for that
address with reverse DNS
- (get_best_device): split out best device code from
update_routing_and_dns()
- (update_etc_hosts): update /etc/hosts with the machine's new hostname
to preserve the 127.0.0.1 reverse mapping that so many things require
- (set_system_hostname): set a given hostname
- (update_system_hostname): implement hostname policy; a configured
hostname (from the system settings service) is used if available,
otherwise an automatically determined hostname from DHCP, VPN, etc.
If there was no automatically determined hostname, reverse DNS of
the best device's IP address will be used, and as a last resort the
hostname 'localhost.localdomain' is set.
- (update_routing_and_dns): use get_best_device(); update the system
hostname when the network config changes
- (hostname_changed): update system hostname if the system settings
service signals a hostname change
- (nm_policy_new): list for system settings service hostname changes
- (nm_policy_destroy): ensure that an in-progress hostname lookup thread
gets told to die
* system-settings/plugins/keyfile/plugin.c
system-settings/plugins/ifcfg-suse/plugin.c
- (get_property, sc_plugin_ifcfg_class_init): implement hostname and
capabilities properties
* system-settings/plugins/ifcfg-fedora/shvar.c
- (svOpenFile): re-enable R/W access of ifcfg files since the plugin
writes out /etc/sysconfig/network now
* system-settings/plugins/ifcfg-fedora/plugin.c
- (plugin_get_hostname): get hostname from /etc/sysconfig/network
- (plugin_set_hostname): save hostname to /etc/sysconfig/network
- (sc_network_changed_cb): handle changes to /etc/sysconfig/network
- (sc_plugin_ifcfg_init): monitor /etc/sysconfig/network for changes
- (get_property, set_property, sc_plugin_ifcfg_class_init): implement
hostname get/set and capabilities get
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4077 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-09-18 15:16:44 +00:00
|
|
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
2013-07-12 11:33:52 +02:00
|
|
|
/* NetworkManager
|
2005-04-15 15:43:42 +00:00
|
|
|
*
|
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
* (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
2008-06-26 18:31:52 +00:00
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
2005-04-15 15:43:42 +00:00
|
|
|
*
|
2014-04-17 11:15:36 +02:00
|
|
|
* Copyright (C) 2005 - 2014 Red Hat, Inc.
|
2008-11-03 04:13:42 +00:00
|
|
|
* Copyright (C) 2006 - 2008 Novell, Inc.
|
2005-04-15 15:43:42 +00:00
|
|
|
*/
|
|
|
|
|
|
2016-02-12 14:44:52 +01:00
|
|
|
#include "nm-default.h"
|
2016-02-19 14:57:48 +01:00
|
|
|
|
2016-02-12 14:44:52 +01:00
|
|
|
#include "nm-ip4-config.h"
|
|
|
|
|
|
2005-04-15 15:43:42 +00:00
|
|
|
#include <string.h>
|
2014-10-19 17:30:10 -04:00
|
|
|
#include <arpa/inet.h>
|
2017-10-06 13:17:58 +02:00
|
|
|
#include <resolv.h>
|
all: rework configuring route table support by adding "route-table" setting
We added "ipv4.route-table-sync" and "ipv6.route-table-sync" to not change
behavior for users that configured policy routing outside of NetworkManager,
for example, via a dispatcher script. Users had to explicitly opt-in
for NetworkManager to fully manage all routing tables.
These settings were awkward. Replace them with new settings "ipv4.route-table"
and "ipv6.route-table". Note that this commit breaks API/ABI on the unstable
development branch by removing recently added API.
As before, a connection will have no route-table set by default. This
has the meaning that policy-routing is not enabled and only the main table
will be fully synced. Once the user sets a table, we recognize that and
NetworkManager manages all routing tables.
The new route-table setting has other important uses: analog to
"ipv4.route-metric", it is the default that applies to all routes.
Currently it only works for static routes, not DHCP, SLAAC,
default-route, etc. That will be implemented later.
For static routes, each route still can explicitly set a table, and
overwrite the per-connection setting in "ipv4.route-table" and
"ipv6.route-table".
2017-09-28 08:40:41 +02:00
|
|
|
#include <linux/rtnetlink.h>
|
2013-07-12 11:33:52 +02:00
|
|
|
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
#include "nm-utils/nm-dedup-multi.h"
|
|
|
|
|
|
2008-06-02 08:44:48 +00:00
|
|
|
#include "nm-utils.h"
|
2017-06-12 18:40:14 +02:00
|
|
|
#include "platform/nmp-object.h"
|
2016-11-21 00:43:52 +01:00
|
|
|
#include "platform/nm-platform.h"
|
|
|
|
|
#include "platform/nm-platform-utils.h"
|
2013-11-19 22:28:36 -06:00
|
|
|
#include "NetworkManagerUtils.h"
|
2015-05-20 12:21:11 +02:00
|
|
|
#include "nm-core-internal.h"
|
2006-01-16 22:58:13 +00:00
|
|
|
|
2016-11-23 13:14:08 +01:00
|
|
|
#include "introspection/org.freedesktop.NetworkManager.IP4Config.h"
|
2015-04-15 14:53:30 -04:00
|
|
|
|
2017-01-15 12:15:58 +01:00
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
/* internal guint32 are assigned to gobject properties of type uint. Ensure, that uint is large enough */
|
|
|
|
|
G_STATIC_ASSERT (sizeof (uint) >= sizeof (guint32));
|
|
|
|
|
G_STATIC_ASSERT (G_MAXUINT >= 0xFFFFFFFF);
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2017-07-19 11:30:13 +02:00
|
|
|
static gboolean
|
|
|
|
|
_route_valid (const NMPlatformIP4Route *r)
|
|
|
|
|
{
|
|
|
|
|
return r
|
|
|
|
|
&& r->plen <= 32
|
|
|
|
|
&& r->network == nm_utils_ip4_address_clear_host_address (r->network, r->plen);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2017-06-12 18:40:14 +02:00
|
|
|
static guint
|
|
|
|
|
_idx_obj_id_hash (const NMDedupMultiIdxType *idx_type,
|
|
|
|
|
const NMDedupMultiObj *obj)
|
|
|
|
|
{
|
2017-09-11 21:41:57 +02:00
|
|
|
return nmp_object_id_hash ((NMPObject *) obj);
|
2017-06-12 18:40:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
_idx_obj_id_equal (const NMDedupMultiIdxType *idx_type,
|
|
|
|
|
const NMDedupMultiObj *obj_a,
|
|
|
|
|
const NMDedupMultiObj *obj_b)
|
|
|
|
|
{
|
2017-09-11 21:41:57 +02:00
|
|
|
return nmp_object_id_equal ((NMPObject *) obj_a, (NMPObject *) obj_b);
|
2017-06-12 18:40:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
nm_ip_config_dedup_multi_idx_type_init (NMIPConfigDedupMultiIdxType *idx_type,
|
|
|
|
|
NMPObjectType obj_type)
|
|
|
|
|
{
|
2017-09-11 21:41:57 +02:00
|
|
|
static const NMDedupMultiIdxTypeClass idx_type_class = {
|
|
|
|
|
.idx_obj_id_hash = _idx_obj_id_hash,
|
|
|
|
|
.idx_obj_id_equal = _idx_obj_id_equal,
|
|
|
|
|
};
|
|
|
|
|
|
2017-06-12 18:40:14 +02:00
|
|
|
nm_dedup_multi_idx_type_init ((NMDedupMultiIdxType *) idx_type,
|
2017-09-11 21:41:57 +02:00
|
|
|
&idx_type_class);
|
2017-06-12 18:40:14 +02:00
|
|
|
idx_type->obj_type = obj_type;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
gboolean
|
|
|
|
|
_nm_ip_config_add_obj (NMDedupMultiIndex *multi_idx,
|
|
|
|
|
NMIPConfigDedupMultiIdxType *idx_type,
|
|
|
|
|
int ifindex,
|
|
|
|
|
const NMPObject *obj_new,
|
2017-08-16 14:38:39 +02:00
|
|
|
const NMPlatformObject *pl_new,
|
|
|
|
|
gboolean merge,
|
2017-08-30 19:05:38 +02:00
|
|
|
gboolean append_force,
|
2017-09-05 10:36:50 +02:00
|
|
|
const NMPObject **out_obj_old /* returns a reference! */,
|
|
|
|
|
const NMPObject **out_obj_new /* does not return a reference */)
|
2017-07-07 23:34:41 +02:00
|
|
|
{
|
|
|
|
|
NMPObject obj_new_stackinit;
|
|
|
|
|
const NMDedupMultiEntry *entry_old;
|
2017-08-30 19:05:38 +02:00
|
|
|
const NMDedupMultiEntry *entry_new;
|
2017-07-07 23:34:41 +02:00
|
|
|
|
|
|
|
|
nm_assert (multi_idx);
|
|
|
|
|
nm_assert (idx_type);
|
|
|
|
|
nm_assert (NM_IN_SET (idx_type->obj_type, NMP_OBJECT_TYPE_IP4_ADDRESS,
|
|
|
|
|
NMP_OBJECT_TYPE_IP4_ROUTE,
|
|
|
|
|
NMP_OBJECT_TYPE_IP6_ADDRESS,
|
|
|
|
|
NMP_OBJECT_TYPE_IP6_ROUTE));
|
|
|
|
|
nm_assert (ifindex > 0);
|
|
|
|
|
|
|
|
|
|
/* we go through extra lengths to accept a full obj_new object. That one,
|
|
|
|
|
* can be reused by increasing the ref-count. */
|
|
|
|
|
if (!obj_new) {
|
|
|
|
|
nm_assert (pl_new);
|
|
|
|
|
obj_new = nmp_object_stackinit (&obj_new_stackinit, idx_type->obj_type, pl_new);
|
|
|
|
|
obj_new_stackinit.object.ifindex = ifindex;
|
|
|
|
|
} else {
|
|
|
|
|
nm_assert (!pl_new);
|
|
|
|
|
nm_assert (NMP_OBJECT_GET_TYPE (obj_new) == idx_type->obj_type);
|
|
|
|
|
if (obj_new->object.ifindex != ifindex) {
|
|
|
|
|
obj_new = nmp_object_stackinit_obj (&obj_new_stackinit, obj_new);
|
|
|
|
|
obj_new_stackinit.object.ifindex = ifindex;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
nm_assert (NMP_OBJECT_GET_TYPE (obj_new) == idx_type->obj_type);
|
|
|
|
|
nm_assert (nmp_object_is_alive (obj_new));
|
|
|
|
|
|
|
|
|
|
entry_old = nm_dedup_multi_index_lookup_obj (multi_idx, &idx_type->parent, obj_new);
|
|
|
|
|
|
|
|
|
|
if (entry_old) {
|
|
|
|
|
gboolean modified = FALSE;
|
|
|
|
|
const NMPObject *obj_old = entry_old->obj;
|
|
|
|
|
|
2017-08-31 12:51:48 +02:00
|
|
|
if (nmp_object_equal (obj_new, obj_old)) {
|
|
|
|
|
nm_dedup_multi_entry_set_dirty (entry_old, FALSE);
|
2017-08-16 14:38:39 +02:00
|
|
|
goto append_force_and_out;
|
2017-08-31 12:51:48 +02:00
|
|
|
}
|
2017-08-16 14:38:39 +02:00
|
|
|
|
|
|
|
|
/* if @merge, we merge the new object with the existing one.
|
|
|
|
|
* Otherwise, we replace it entirely. */
|
|
|
|
|
if (merge) {
|
|
|
|
|
switch (idx_type->obj_type) {
|
|
|
|
|
case NMP_OBJECT_TYPE_IP4_ADDRESS:
|
|
|
|
|
case NMP_OBJECT_TYPE_IP6_ADDRESS:
|
|
|
|
|
/* for addresses that we read from the kernel, we keep the timestamps as defined
|
|
|
|
|
* by the previous source (item_old). The reason is, that the other source configured the lifetimes
|
|
|
|
|
* with "what should be" and the kernel values are "what turned out after configuring it".
|
|
|
|
|
*
|
|
|
|
|
* For other sources, the longer lifetime wins. */
|
|
|
|
|
if ( ( obj_new->ip_address.addr_source == NM_IP_CONFIG_SOURCE_KERNEL
|
|
|
|
|
&& obj_old->ip_address.addr_source != NM_IP_CONFIG_SOURCE_KERNEL)
|
|
|
|
|
|| nm_platform_ip_address_cmp_expiry (NMP_OBJECT_CAST_IP_ADDRESS (obj_old), NMP_OBJECT_CAST_IP_ADDRESS(obj_new)) > 0) {
|
|
|
|
|
obj_new = nmp_object_stackinit_obj (&obj_new_stackinit, obj_new);
|
|
|
|
|
obj_new_stackinit.ip_address.timestamp = NMP_OBJECT_CAST_IP_ADDRESS (obj_old)->timestamp;
|
|
|
|
|
obj_new_stackinit.ip_address.lifetime = NMP_OBJECT_CAST_IP_ADDRESS (obj_old)->lifetime;
|
|
|
|
|
obj_new_stackinit.ip_address.preferred = NMP_OBJECT_CAST_IP_ADDRESS (obj_old)->preferred;
|
|
|
|
|
modified = TRUE;
|
|
|
|
|
}
|
2017-09-12 13:24:52 +02:00
|
|
|
|
|
|
|
|
/* keep the maximum addr_source. */
|
|
|
|
|
if (obj_new->ip_address.addr_source < obj_old->ip_address.addr_source) {
|
|
|
|
|
obj_new = nmp_object_stackinit_obj (&obj_new_stackinit, obj_new);
|
|
|
|
|
obj_new_stackinit.ip_address.addr_source = obj_old->ip_address.addr_source;
|
|
|
|
|
modified = TRUE;
|
|
|
|
|
}
|
2017-08-16 14:38:39 +02:00
|
|
|
break;
|
|
|
|
|
case NMP_OBJECT_TYPE_IP4_ROUTE:
|
|
|
|
|
case NMP_OBJECT_TYPE_IP6_ROUTE:
|
2017-09-12 13:24:52 +02:00
|
|
|
/* keep the maximum rt_source. */
|
2017-08-16 14:38:39 +02:00
|
|
|
if (obj_new->ip_route.rt_source < obj_old->ip_route.rt_source) {
|
|
|
|
|
obj_new = nmp_object_stackinit_obj (&obj_new_stackinit, obj_new);
|
|
|
|
|
obj_new_stackinit.ip_route.rt_source = obj_old->ip_route.rt_source;
|
|
|
|
|
modified = TRUE;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
nm_assert_not_reached ();
|
|
|
|
|
break;
|
2017-07-07 23:34:41 +02:00
|
|
|
}
|
|
|
|
|
|
2017-08-16 14:38:39 +02:00
|
|
|
if ( modified
|
2017-08-31 12:51:48 +02:00
|
|
|
&& nmp_object_equal (obj_new, obj_old)) {
|
|
|
|
|
nm_dedup_multi_entry_set_dirty (entry_old, FALSE);
|
2017-08-16 14:38:39 +02:00
|
|
|
goto append_force_and_out;
|
2017-08-31 12:51:48 +02:00
|
|
|
}
|
2017-07-07 23:34:41 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!nm_dedup_multi_index_add_full (multi_idx,
|
|
|
|
|
&idx_type->parent,
|
|
|
|
|
obj_new,
|
|
|
|
|
NM_DEDUP_MULTI_IDX_MODE_APPEND,
|
|
|
|
|
NULL,
|
|
|
|
|
entry_old ?: NM_DEDUP_MULTI_ENTRY_MISSING,
|
|
|
|
|
NULL,
|
2017-08-30 19:05:38 +02:00
|
|
|
&entry_new,
|
2017-09-05 10:36:50 +02:00
|
|
|
out_obj_old)) {
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_assert_not_reached ();
|
2017-08-30 19:05:38 +02:00
|
|
|
NM_SET_OUT (out_obj_new, NULL);
|
2017-07-07 23:34:41 +02:00
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-30 19:05:38 +02:00
|
|
|
NM_SET_OUT (out_obj_new, entry_new->obj);
|
2017-07-07 23:34:41 +02:00
|
|
|
return TRUE;
|
2017-08-16 14:38:39 +02:00
|
|
|
|
|
|
|
|
append_force_and_out:
|
2017-09-05 10:36:50 +02:00
|
|
|
NM_SET_OUT (out_obj_old, nmp_object_ref (entry_old->obj));
|
2017-08-30 19:05:38 +02:00
|
|
|
NM_SET_OUT (out_obj_new, entry_old->obj);
|
2017-08-16 14:38:39 +02:00
|
|
|
if (append_force) {
|
|
|
|
|
if (nm_dedup_multi_entry_reorder (entry_old, NULL, TRUE))
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
2017-07-07 23:34:41 +02:00
|
|
|
}
|
|
|
|
|
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
/**
|
|
|
|
|
* _nm_ip_config_lookup_ip_route:
|
|
|
|
|
* @multi_idx:
|
|
|
|
|
* @idx_type:
|
|
|
|
|
* @needle:
|
|
|
|
|
* @cmp_type: after lookup, filter the result by comparing with @cmp_type. Only
|
|
|
|
|
* return the result, if it compares equal to @needle according to this @cmp_type.
|
|
|
|
|
* Note that the index uses %NM_PLATFORM_IP_ROUTE_CMP_TYPE_DST type, so passing
|
|
|
|
|
* that compare-type means not to filter any further.
|
|
|
|
|
*
|
|
|
|
|
* Returns: the found entry or %NULL.
|
|
|
|
|
*/
|
|
|
|
|
const NMDedupMultiEntry *
|
|
|
|
|
_nm_ip_config_lookup_ip_route (const NMDedupMultiIndex *multi_idx,
|
|
|
|
|
const NMIPConfigDedupMultiIdxType *idx_type,
|
|
|
|
|
const NMPObject *needle,
|
|
|
|
|
NMPlatformIPRouteCmpType cmp_type)
|
|
|
|
|
{
|
|
|
|
|
const NMDedupMultiEntry *entry;
|
|
|
|
|
|
|
|
|
|
nm_assert (multi_idx);
|
|
|
|
|
nm_assert (idx_type);
|
|
|
|
|
nm_assert (NM_IN_SET (idx_type->obj_type, NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE));
|
|
|
|
|
nm_assert (NMP_OBJECT_GET_TYPE (needle) == idx_type->obj_type);
|
|
|
|
|
|
|
|
|
|
entry = nm_dedup_multi_index_lookup_obj (multi_idx,
|
|
|
|
|
&idx_type->parent,
|
|
|
|
|
needle);
|
|
|
|
|
if (!entry)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
2017-09-19 09:40:13 +02:00
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) {
|
|
|
|
|
nm_assert ( ( NMP_OBJECT_GET_TYPE (needle) == NMP_OBJECT_TYPE_IP4_ROUTE
|
|
|
|
|
&& nm_platform_ip4_route_cmp (NMP_OBJECT_CAST_IP4_ROUTE (entry->obj), NMP_OBJECT_CAST_IP4_ROUTE (needle), cmp_type) == 0)
|
|
|
|
|
|| ( NMP_OBJECT_GET_TYPE (needle) == NMP_OBJECT_TYPE_IP6_ROUTE
|
|
|
|
|
&& nm_platform_ip6_route_cmp (NMP_OBJECT_CAST_IP6_ROUTE (entry->obj), NMP_OBJECT_CAST_IP6_ROUTE (needle), cmp_type) == 0));
|
|
|
|
|
} else {
|
|
|
|
|
if (NMP_OBJECT_GET_TYPE (needle) == NMP_OBJECT_TYPE_IP4_ROUTE) {
|
|
|
|
|
if (nm_platform_ip4_route_cmp (NMP_OBJECT_CAST_IP4_ROUTE (entry->obj),
|
|
|
|
|
NMP_OBJECT_CAST_IP4_ROUTE (needle),
|
|
|
|
|
cmp_type) != 0)
|
|
|
|
|
return NULL;
|
|
|
|
|
} else {
|
|
|
|
|
if (nm_platform_ip6_route_cmp (NMP_OBJECT_CAST_IP6_ROUTE (entry->obj),
|
|
|
|
|
NMP_OBJECT_CAST_IP6_ROUTE (needle),
|
|
|
|
|
cmp_type) != 0)
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
}
|
|
|
|
|
return entry;
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2017-01-15 12:15:58 +01:00
|
|
|
NM_GOBJECT_PROPERTIES_DEFINE (NMIP4Config,
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
PROP_MULTI_IDX,
|
2017-01-15 12:15:58 +01:00
|
|
|
PROP_IFINDEX,
|
|
|
|
|
PROP_ADDRESS_DATA,
|
|
|
|
|
PROP_ADDRESSES,
|
|
|
|
|
PROP_ROUTE_DATA,
|
|
|
|
|
PROP_ROUTES,
|
|
|
|
|
PROP_GATEWAY,
|
|
|
|
|
PROP_NAMESERVERS,
|
|
|
|
|
PROP_DOMAINS,
|
|
|
|
|
PROP_SEARCHES,
|
|
|
|
|
PROP_DNS_OPTIONS,
|
|
|
|
|
PROP_WINS_SERVERS,
|
|
|
|
|
PROP_DNS_PRIORITY,
|
|
|
|
|
);
|
|
|
|
|
|
2016-05-11 11:41:54 +02:00
|
|
|
typedef struct {
|
2017-01-15 12:33:10 +01:00
|
|
|
bool never_default:1;
|
|
|
|
|
bool metered:1;
|
|
|
|
|
bool has_gateway:1;
|
2013-07-12 11:33:52 +02:00
|
|
|
guint32 gateway;
|
2017-01-15 12:33:10 +01:00
|
|
|
guint32 mss;
|
|
|
|
|
guint32 mtu;
|
|
|
|
|
int ifindex;
|
|
|
|
|
NMIPConfigSource mtu_source;
|
|
|
|
|
gint dns_priority;
|
|
|
|
|
gint64 route_metric;
|
2007-02-16 11:23:49 +00:00
|
|
|
GArray *nameservers;
|
|
|
|
|
GPtrArray *domains;
|
2008-03-09 05:11:22 +00:00
|
|
|
GPtrArray *searches;
|
2015-03-26 09:23:12 +01:00
|
|
|
GPtrArray *dns_options;
|
2010-07-16 11:28:39 -07:00
|
|
|
GArray *nis;
|
2013-07-12 11:33:52 +02:00
|
|
|
char *nis_domain;
|
|
|
|
|
GArray *wins;
|
2016-11-18 11:52:38 +01:00
|
|
|
GVariant *address_data_variant;
|
|
|
|
|
GVariant *addresses_variant;
|
2017-07-11 13:20:23 +02:00
|
|
|
GVariant *route_data_variant;
|
|
|
|
|
GVariant *routes_variant;
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
NMDedupMultiIndex *multi_idx;
|
2017-08-31 13:39:04 +02:00
|
|
|
const NMPObject *best_default_route;
|
2017-07-07 23:34:41 +02:00
|
|
|
union {
|
|
|
|
|
NMIPConfigDedupMultiIdxType idx_ip4_addresses_;
|
|
|
|
|
NMDedupMultiIdxType idx_ip4_addresses;
|
|
|
|
|
};
|
2017-07-10 21:53:24 +02:00
|
|
|
union {
|
|
|
|
|
NMIPConfigDedupMultiIdxType idx_ip4_routes_;
|
|
|
|
|
NMDedupMultiIdxType idx_ip4_routes;
|
|
|
|
|
};
|
2007-02-16 11:23:49 +00:00
|
|
|
} NMIP4ConfigPrivate;
|
|
|
|
|
|
2016-05-11 11:41:54 +02:00
|
|
|
struct _NMIP4Config {
|
|
|
|
|
NMExportedObject parent;
|
|
|
|
|
NMIP4ConfigPrivate _priv;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct _NMIP4ConfigClass {
|
|
|
|
|
NMExportedObjectClass parent;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
G_DEFINE_TYPE (NMIP4Config, nm_ip4_config, NM_TYPE_EXPORTED_OBJECT)
|
|
|
|
|
|
2016-09-05 16:55:07 +02:00
|
|
|
#define NM_IP4_CONFIG_GET_PRIVATE(self) _NM_GET_PRIVATE(self, NMIP4Config, NM_IS_IP4_CONFIG)
|
2016-05-11 11:41:54 +02:00
|
|
|
|
2017-01-15 12:15:58 +01:00
|
|
|
/*****************************************************************************/
|
2013-07-12 11:33:52 +02:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
static void _add_address (NMIP4Config *self, const NMPObject *obj_new, const NMPlatformIP4Address *new);
|
2017-09-05 10:36:50 +02:00
|
|
|
static void _add_route (NMIP4Config *self, const NMPObject *obj_new, const NMPlatformIP4Route *new, const NMPObject **out_obj_new);
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
static const NMDedupMultiEntry *_lookup_route (const NMIP4Config *self,
|
|
|
|
|
const NMPObject *needle,
|
|
|
|
|
NMPlatformIPRouteCmpType cmp_type);
|
2017-06-12 18:40:14 +02:00
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2015-02-27 16:49:42 +01:00
|
|
|
int
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_ifindex (const NMIP4Config *self)
|
2015-02-27 16:49:42 +01:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
return NM_IP4_CONFIG_GET_PRIVATE (self)->ifindex;
|
2015-02-27 16:49:42 +01:00
|
|
|
}
|
|
|
|
|
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
NMDedupMultiIndex *
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_multi_idx (const NMIP4Config *self)
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
return NM_IP4_CONFIG_GET_PRIVATE (self)->multi_idx;
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2015-10-22 15:15:47 +02:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
static gboolean
|
2015-10-22 15:15:47 +02:00
|
|
|
_ipv4_is_zeronet (in_addr_t network)
|
2013-07-12 11:33:52 +02:00
|
|
|
{
|
2015-10-22 15:15:47 +02:00
|
|
|
/* Same as ipv4_is_zeronet() from kernel's include/linux/in.h. */
|
|
|
|
|
return (network & htonl(0xff000000)) == htonl(0x00000000);
|
2013-07-03 10:26:19 +02:00
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-07-03 10:26:19 +02:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMDedupMultiHeadEntry *
|
|
|
|
|
nm_ip4_config_lookup_addresses (const NMIP4Config *self)
|
2017-06-12 18:40:14 +02:00
|
|
|
{
|
|
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
|
|
|
|
|
|
|
|
|
return nm_dedup_multi_index_lookup_head (priv->multi_idx,
|
2017-07-07 23:34:41 +02:00
|
|
|
&priv->idx_ip4_addresses,
|
2017-06-12 18:40:14 +02:00
|
|
|
NULL);
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
void
|
|
|
|
|
nm_ip_config_iter_ip4_address_init (NMDedupMultiIter *ipconf_iter, const NMIP4Config *self)
|
2017-06-12 18:40:14 +02:00
|
|
|
{
|
2017-07-07 23:34:41 +02:00
|
|
|
g_return_if_fail (NM_IS_IP4_CONFIG (self));
|
|
|
|
|
nm_dedup_multi_iter_init (ipconf_iter, nm_ip4_config_lookup_addresses (self));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
2017-06-12 18:40:14 +02:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMDedupMultiHeadEntry *
|
|
|
|
|
nm_ip4_config_lookup_routes (const NMIP4Config *self)
|
|
|
|
|
{
|
|
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
|
|
|
|
|
|
|
|
|
return nm_dedup_multi_index_lookup_head (priv->multi_idx,
|
|
|
|
|
&priv->idx_ip4_routes,
|
|
|
|
|
NULL);
|
2017-06-12 18:40:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_iter_ip4_route_init (NMDedupMultiIter *ipconf_iter, const NMIP4Config *self)
|
2017-06-12 18:40:14 +02:00
|
|
|
{
|
|
|
|
|
g_return_if_fail (NM_IS_IP4_CONFIG (self));
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_dedup_multi_iter_init (ipconf_iter, nm_ip4_config_lookup_routes (self));
|
2017-06-12 18:40:14 +02:00
|
|
|
}
|
|
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2017-08-31 13:39:04 +02:00
|
|
|
const NMPObject *
|
|
|
|
|
_nm_ip_config_best_default_route_find_better (const NMPObject *obj_cur, const NMPObject *obj_cmp)
|
|
|
|
|
{
|
|
|
|
|
int addr_family;
|
|
|
|
|
int c;
|
|
|
|
|
guint metric_cur, metric_cmp;
|
|
|
|
|
|
|
|
|
|
nm_assert ( !obj_cur
|
|
|
|
|
|| NM_IN_SET (NMP_OBJECT_GET_TYPE (obj_cur), NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE));
|
|
|
|
|
nm_assert ( !obj_cmp
|
|
|
|
|
|| ( !obj_cur
|
|
|
|
|
&& NM_IN_SET (NMP_OBJECT_GET_TYPE (obj_cmp), NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE))
|
|
|
|
|
|| NMP_OBJECT_GET_TYPE (obj_cur) == NMP_OBJECT_GET_TYPE (obj_cmp));
|
|
|
|
|
nm_assert ( !obj_cur
|
|
|
|
|
|| nm_ip_config_best_default_route_is (obj_cur));
|
|
|
|
|
|
|
|
|
|
/* assumes that @obj_cur is already the best default route (or NULL). It checks whether
|
|
|
|
|
* @obj_cmp is also a default route and returns the best of both. */
|
|
|
|
|
if ( obj_cmp
|
|
|
|
|
&& nm_ip_config_best_default_route_is (obj_cmp)) {
|
|
|
|
|
if (!obj_cur)
|
|
|
|
|
return obj_cmp;
|
|
|
|
|
|
|
|
|
|
addr_family = NMP_OBJECT_GET_CLASS (obj_cmp)->addr_family;
|
|
|
|
|
metric_cur = nm_utils_ip_route_metric_normalize (addr_family, NMP_OBJECT_CAST_IP_ROUTE (obj_cur)->metric);
|
|
|
|
|
metric_cmp = nm_utils_ip_route_metric_normalize (addr_family, NMP_OBJECT_CAST_IP_ROUTE (obj_cmp)->metric);
|
|
|
|
|
|
|
|
|
|
if (metric_cmp < metric_cur)
|
|
|
|
|
return obj_cmp;
|
|
|
|
|
|
|
|
|
|
if (metric_cmp == metric_cur) {
|
|
|
|
|
/* Routes have the same metric. We still want to deterministically
|
|
|
|
|
* prefer one or the other. It's important to consistently choose one
|
|
|
|
|
* or the other, so that the order doesn't matter how routes are added
|
|
|
|
|
* (and merged). */
|
|
|
|
|
c = nmp_object_cmp (obj_cur, obj_cmp);
|
|
|
|
|
if (c != 0)
|
|
|
|
|
return c < 0 ? obj_cur : obj_cmp;
|
|
|
|
|
|
|
|
|
|
/* as last resort, compare pointers. */
|
|
|
|
|
if (obj_cmp < obj_cur)
|
|
|
|
|
return obj_cmp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return obj_cur;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
|
|
|
|
_nm_ip_config_best_default_route_set (const NMPObject **best_default_route, const NMPObject *new_candidate)
|
|
|
|
|
{
|
|
|
|
|
if (new_candidate == *best_default_route)
|
|
|
|
|
return FALSE;
|
|
|
|
|
nmp_object_ref (new_candidate);
|
|
|
|
|
nm_clear_nmp_object (best_default_route);
|
|
|
|
|
*best_default_route = new_candidate;
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
|
|
|
|
_nm_ip_config_best_default_route_merge (const NMPObject **best_default_route, const NMPObject *new_candidate)
|
|
|
|
|
{
|
|
|
|
|
new_candidate = _nm_ip_config_best_default_route_find_better (*best_default_route,
|
|
|
|
|
new_candidate);
|
|
|
|
|
return _nm_ip_config_best_default_route_set (best_default_route, new_candidate);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const NMPObject *
|
|
|
|
|
nm_ip4_config_best_default_route_get (const NMIP4Config *self)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (NM_IS_IP4_CONFIG (self), NULL);
|
|
|
|
|
|
|
|
|
|
return NM_IP4_CONFIG_GET_PRIVATE (self)->best_default_route;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const NMPObject *
|
|
|
|
|
_nm_ip4_config_best_default_route_find (const NMIP4Config *self)
|
|
|
|
|
{
|
|
|
|
|
NMDedupMultiIter ipconf_iter;
|
|
|
|
|
const NMPObject *new_best_default_route = NULL;
|
|
|
|
|
|
|
|
|
|
nm_ip_config_iter_ip4_route_for_each (&ipconf_iter, self, NULL) {
|
|
|
|
|
new_best_default_route = _nm_ip_config_best_default_route_find_better (new_best_default_route,
|
|
|
|
|
ipconf_iter.current->obj);
|
|
|
|
|
}
|
|
|
|
|
return new_best_default_route;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
static void
|
|
|
|
|
_notify_addresses (NMIP4Config *self)
|
2017-06-12 18:40:14 +02:00
|
|
|
{
|
2017-07-07 23:34:41 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2017-06-12 18:40:14 +02:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_clear_g_variant (&priv->address_data_variant);
|
|
|
|
|
nm_clear_g_variant (&priv->addresses_variant);
|
|
|
|
|
_notify (self, PROP_ADDRESS_DATA);
|
|
|
|
|
_notify (self, PROP_ADDRESSES);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
_notify_routes (NMIP4Config *self)
|
|
|
|
|
{
|
2017-07-11 13:20:23 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
|
|
|
|
|
2017-08-31 13:39:04 +02:00
|
|
|
nm_assert (priv->best_default_route == _nm_ip4_config_best_default_route_find (self));
|
2017-07-11 13:20:23 +02:00
|
|
|
nm_clear_g_variant (&priv->route_data_variant);
|
|
|
|
|
nm_clear_g_variant (&priv->routes_variant);
|
2017-07-07 23:34:41 +02:00
|
|
|
_notify (self, PROP_ROUTE_DATA);
|
|
|
|
|
_notify (self, PROP_ROUTES);
|
2017-06-12 18:40:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2016-02-18 20:23:10 +01:00
|
|
|
static gint
|
|
|
|
|
_addresses_sort_cmp_get_prio (in_addr_t addr)
|
|
|
|
|
{
|
2016-03-07 11:45:44 +01:00
|
|
|
if (nm_utils_ip4_address_is_link_local (addr))
|
2016-02-18 20:23:10 +01:00
|
|
|
return 0;
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
static int
|
|
|
|
|
_addresses_sort_cmp (gconstpointer a, gconstpointer b, gpointer user_data)
|
2016-02-18 20:23:10 +01:00
|
|
|
{
|
2016-11-18 11:48:12 +01:00
|
|
|
gint p1, p2;
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMPlatformIP4Address *a1 = NMP_OBJECT_CAST_IP4_ADDRESS (*((const NMPObject **) a));
|
|
|
|
|
const NMPlatformIP4Address *a2 = NMP_OBJECT_CAST_IP4_ADDRESS (*((const NMPObject **) b));
|
2016-11-18 11:48:12 +01:00
|
|
|
guint32 n1, n2;
|
2016-02-18 20:23:10 +01:00
|
|
|
|
|
|
|
|
/* Sort by address type. For example link local will
|
|
|
|
|
* be sorted *after* a global address. */
|
|
|
|
|
p1 = _addresses_sort_cmp_get_prio (a1->address);
|
|
|
|
|
p2 = _addresses_sort_cmp_get_prio (a2->address);
|
|
|
|
|
if (p1 != p2)
|
|
|
|
|
return p1 > p2 ? -1 : 1;
|
|
|
|
|
|
|
|
|
|
/* Sort the addresses based on their source. */
|
2016-04-11 13:09:52 +02:00
|
|
|
if (a1->addr_source != a2->addr_source)
|
|
|
|
|
return a1->addr_source > a2->addr_source ? -1 : 1;
|
2016-02-18 20:23:10 +01:00
|
|
|
|
|
|
|
|
if ((a1->label[0] == '\0') != (a2->label[0] == '\0'))
|
|
|
|
|
return (a1->label[0] == '\0') ? -1 : 1;
|
|
|
|
|
|
2016-11-18 11:48:12 +01:00
|
|
|
/* Finally, sort addresses lexically. We compare only the
|
|
|
|
|
* network part so that the order of addresses in the same
|
|
|
|
|
* subnet (and thus also the primary/secondary role) is
|
|
|
|
|
* preserved.
|
|
|
|
|
*/
|
2017-09-05 15:25:34 +02:00
|
|
|
n1 = a1->address & _nm_utils_ip4_prefix_to_netmask (a1->plen);
|
|
|
|
|
n2 = a2->address & _nm_utils_ip4_prefix_to_netmask (a2->plen);
|
2016-11-18 11:48:12 +01:00
|
|
|
|
|
|
|
|
return memcmp (&n1, &n2, sizeof (guint32));
|
2016-02-18 20:23:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
static int
|
|
|
|
|
sort_captured_addresses (const CList *lst_a, const CList *lst_b, gconstpointer user_data)
|
2017-06-13 14:44:22 +02:00
|
|
|
{
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMPlatformIP4Address *addr_a = NMP_OBJECT_CAST_IP4_ADDRESS (c_list_entry (lst_a, NMDedupMultiEntry, lst_entries)->obj);
|
|
|
|
|
const NMPlatformIP4Address *addr_b = NMP_OBJECT_CAST_IP4_ADDRESS (c_list_entry (lst_b, NMDedupMultiEntry, lst_entries)->obj);
|
2017-06-13 14:44:22 +02:00
|
|
|
|
|
|
|
|
/* Primary addresses first */
|
|
|
|
|
return NM_FLAGS_HAS (addr_a->n_ifa_flags, IFA_F_SECONDARY) -
|
|
|
|
|
NM_FLAGS_HAS (addr_b->n_ifa_flags, IFA_F_SECONDARY);
|
|
|
|
|
}
|
|
|
|
|
|
2013-04-04 10:20:24 -04:00
|
|
|
NMIP4Config *
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
nm_ip4_config_capture (NMDedupMultiIndex *multi_idx, NMPlatform *platform, int ifindex, gboolean capture_resolv_conf)
|
2013-04-04 10:20:24 -04:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4Config *self;
|
2013-11-06 14:13:59 -06:00
|
|
|
NMIP4ConfigPrivate *priv;
|
2017-06-29 15:19:35 +02:00
|
|
|
guint32 lowest_metric;
|
2013-11-19 22:51:29 -06:00
|
|
|
guint32 old_gateway = 0;
|
2015-07-21 23:07:34 +02:00
|
|
|
gboolean old_has_gateway = FALSE;
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMDedupMultiHeadEntry *head_entry;
|
2017-06-29 15:19:35 +02:00
|
|
|
NMDedupMultiIter iter;
|
|
|
|
|
const NMPObject *plobj = NULL;
|
2017-07-07 23:34:41 +02:00
|
|
|
gboolean has_addresses = FALSE;
|
|
|
|
|
|
|
|
|
|
nm_assert (ifindex > 0);
|
2013-11-06 14:13:59 -06:00
|
|
|
|
|
|
|
|
/* Slaves have no IP configuration */
|
2017-04-17 20:17:45 +02:00
|
|
|
if (nm_platform_link_get_master (platform, ifindex) > 0)
|
2013-11-06 14:13:59 -06:00
|
|
|
return NULL;
|
|
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
self = nm_ip4_config_new (multi_idx, ifindex);
|
|
|
|
|
priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2013-04-04 10:20:24 -04:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
head_entry = nm_platform_lookup_addrroute (platform,
|
|
|
|
|
NMP_OBJECT_TYPE_IP4_ADDRESS,
|
|
|
|
|
ifindex);
|
|
|
|
|
if (head_entry) {
|
|
|
|
|
nmp_cache_iter_for_each (&iter, head_entry, &plobj) {
|
2017-08-30 14:05:16 +02:00
|
|
|
if (!_nm_ip_config_add_obj (priv->multi_idx,
|
|
|
|
|
&priv->idx_ip4_addresses_,
|
|
|
|
|
ifindex,
|
|
|
|
|
plobj,
|
|
|
|
|
NULL,
|
|
|
|
|
FALSE,
|
2017-08-30 19:05:38 +02:00
|
|
|
TRUE,
|
2017-09-05 10:36:50 +02:00
|
|
|
NULL,
|
2017-08-30 19:05:38 +02:00
|
|
|
NULL))
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_assert_not_reached ();
|
|
|
|
|
}
|
|
|
|
|
head_entry = nm_ip4_config_lookup_addresses (self);
|
|
|
|
|
nm_assert (head_entry);
|
|
|
|
|
nm_dedup_multi_head_entry_sort (head_entry,
|
|
|
|
|
sort_captured_addresses,
|
|
|
|
|
NULL);
|
|
|
|
|
has_addresses = TRUE;
|
|
|
|
|
}
|
2017-06-13 14:44:22 +02:00
|
|
|
|
2017-08-11 10:15:25 +02:00
|
|
|
head_entry = nm_platform_lookup_addrroute (platform,
|
|
|
|
|
NMP_OBJECT_TYPE_IP4_ROUTE,
|
|
|
|
|
ifindex);
|
2013-11-02 09:44:47 -05:00
|
|
|
|
|
|
|
|
/* Extract gateway from default route */
|
2013-11-19 22:51:29 -06:00
|
|
|
old_gateway = priv->gateway;
|
2015-07-21 23:07:34 +02:00
|
|
|
old_has_gateway = priv->has_gateway;
|
2013-11-02 09:44:47 -05:00
|
|
|
|
2017-06-29 15:19:35 +02:00
|
|
|
lowest_metric = G_MAXUINT32;
|
|
|
|
|
priv->has_gateway = FALSE;
|
2017-07-07 23:34:41 +02:00
|
|
|
nmp_cache_iter_for_each (&iter, head_entry, &plobj) {
|
2017-06-29 15:19:35 +02:00
|
|
|
const NMPlatformIP4Route *route = NMP_OBJECT_CAST_IP4_ROUTE (plobj);
|
|
|
|
|
|
2017-09-01 13:53:36 +02:00
|
|
|
if ( !route->table_coerced
|
|
|
|
|
&& NM_PLATFORM_IP_ROUTE_IS_DEFAULT (route)
|
2017-06-29 15:19:35 +02:00
|
|
|
&& route->rt_source != NM_IP_CONFIG_SOURCE_RTPROT_KERNEL) {
|
2013-11-19 22:51:29 -06:00
|
|
|
if (route->metric < lowest_metric) {
|
2013-11-02 09:44:47 -05:00
|
|
|
priv->gateway = route->gateway;
|
2013-11-19 22:51:29 -06:00
|
|
|
lowest_metric = route->metric;
|
2013-11-02 09:44:47 -05:00
|
|
|
}
|
2015-07-21 23:07:34 +02:00
|
|
|
priv->has_gateway = TRUE;
|
2013-11-02 09:44:47 -05:00
|
|
|
}
|
2017-06-29 15:19:35 +02:00
|
|
|
|
2017-09-05 10:36:50 +02:00
|
|
|
_add_route (self, plobj, NULL, NULL);
|
2013-12-02 16:24:06 -06:00
|
|
|
}
|
|
|
|
|
|
2017-09-01 13:38:13 +02:00
|
|
|
/* we detect the route metric based on the default route. All non-default
|
|
|
|
|
* routes have their route metrics explicitly set. */
|
|
|
|
|
priv->route_metric = priv->has_gateway ? (gint64) lowest_metric : (gint64) -1;
|
|
|
|
|
|
2013-11-19 22:28:36 -06:00
|
|
|
/* If the interface has the default route, and has IPv4 addresses, capture
|
|
|
|
|
* nameservers from /etc/resolv.conf.
|
|
|
|
|
*/
|
2017-07-07 23:34:41 +02:00
|
|
|
if (has_addresses && priv->has_gateway && capture_resolv_conf) {
|
2017-10-06 13:17:58 +02:00
|
|
|
gs_free char *rc_contents = NULL;
|
|
|
|
|
|
|
|
|
|
if (g_file_get_contents (_PATH_RESCONF, &rc_contents, NULL, NULL)) {
|
|
|
|
|
if (nm_utils_resolve_conf_parse (AF_INET,
|
|
|
|
|
rc_contents,
|
|
|
|
|
priv->nameservers,
|
|
|
|
|
priv->dns_options))
|
|
|
|
|
_notify (self, PROP_NAMESERVERS);
|
|
|
|
|
}
|
2013-11-19 22:28:36 -06:00
|
|
|
}
|
|
|
|
|
|
2013-09-06 11:56:41 +02:00
|
|
|
/* actually, nobody should be connected to the signal, just to be sure, notify */
|
2017-07-07 23:34:41 +02:00
|
|
|
_notify_addresses (self);
|
|
|
|
|
_notify_routes (self);
|
2015-07-21 23:07:34 +02:00
|
|
|
if ( priv->gateway != old_gateway
|
|
|
|
|
|| priv->has_gateway != old_has_gateway)
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_GATEWAY);
|
2013-09-06 11:56:41 +02:00
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
return self;
|
2013-04-04 10:20:24 -04:00
|
|
|
}
|
|
|
|
|
|
2017-09-12 13:45:53 +02:00
|
|
|
void
|
|
|
|
|
nm_ip4_config_add_device_routes (NMIP4Config *self,
|
all: rework configuring route table support by adding "route-table" setting
We added "ipv4.route-table-sync" and "ipv6.route-table-sync" to not change
behavior for users that configured policy routing outside of NetworkManager,
for example, via a dispatcher script. Users had to explicitly opt-in
for NetworkManager to fully manage all routing tables.
These settings were awkward. Replace them with new settings "ipv4.route-table"
and "ipv6.route-table". Note that this commit breaks API/ABI on the unstable
development branch by removing recently added API.
As before, a connection will have no route-table set by default. This
has the meaning that policy-routing is not enabled and only the main table
will be fully synced. Once the user sets a table, we recognize that and
NetworkManager manages all routing tables.
The new route-table setting has other important uses: analog to
"ipv4.route-metric", it is the default that applies to all routes.
Currently it only works for static routes, not DHCP, SLAAC,
default-route, etc. That will be implemented later.
For static routes, each route still can explicitly set a table, and
overwrite the per-connection setting in "ipv4.route-table" and
"ipv6.route-table".
2017-09-28 08:40:41 +02:00
|
|
|
guint32 route_metric,
|
2017-09-12 13:45:53 +02:00
|
|
|
GPtrArray **out_ip4_dev_route_blacklist)
|
2013-07-03 10:26:19 +02:00
|
|
|
{
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
const NMIP4ConfigPrivate *priv;
|
2017-09-12 13:45:53 +02:00
|
|
|
GPtrArray *ip4_dev_route_blacklist = NULL;
|
|
|
|
|
const NMPlatformIP4Address *addr;
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
int ifindex;
|
2017-09-12 13:45:53 +02:00
|
|
|
NMDedupMultiIter iter;
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
|
2017-09-12 13:45:53 +02:00
|
|
|
g_return_if_fail (NM_IS_IP4_CONFIG (self));
|
2013-07-03 10:26:19 +02:00
|
|
|
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
|
|
|
|
|
|
|
|
|
ifindex = nm_ip4_config_get_ifindex (self);
|
2017-09-12 13:45:53 +02:00
|
|
|
g_return_if_fail (ifindex > 0);
|
2013-07-03 10:26:19 +02:00
|
|
|
|
2017-09-19 09:40:13 +02:00
|
|
|
/* For IPv6 slaac, we explicitly add the device-routes (onlink) to NMIP6Config.
|
|
|
|
|
* As we don't do that for IPv4 (and manual IPv6 addresses), add them explicitly. */
|
2017-07-07 23:34:41 +02:00
|
|
|
|
2017-09-12 13:45:53 +02:00
|
|
|
nm_ip_config_iter_ip4_address_for_each (&iter, self, &addr) {
|
|
|
|
|
nm_auto_nmpobj NMPObject *r = NULL;
|
|
|
|
|
NMPlatformIP4Route *route;
|
|
|
|
|
in_addr_t network;
|
2017-08-14 14:24:39 +02:00
|
|
|
|
2017-09-12 13:45:53 +02:00
|
|
|
if (addr->plen == 0)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
nm_assert (addr->plen <= 32);
|
|
|
|
|
|
|
|
|
|
/* The destination network depends on the peer-address. */
|
|
|
|
|
network = nm_utils_ip4_address_clear_host_address (addr->peer_address, addr->plen);
|
|
|
|
|
|
|
|
|
|
if (_ipv4_is_zeronet (network)) {
|
|
|
|
|
/* Kernel doesn't add device-routes for destinations that
|
|
|
|
|
* start with 0.x.y.z. Skip them. */
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
r = nmp_object_new (NMP_OBJECT_TYPE_IP4_ROUTE, NULL);
|
|
|
|
|
route = NMP_OBJECT_CAST_IP4_ROUTE (r);
|
|
|
|
|
|
|
|
|
|
route->ifindex = ifindex;
|
|
|
|
|
route->rt_source = NM_IP_CONFIG_SOURCE_KERNEL;
|
|
|
|
|
route->network = network;
|
|
|
|
|
route->plen = addr->plen;
|
|
|
|
|
route->pref_src = addr->address;
|
all: rework configuring route table support by adding "route-table" setting
We added "ipv4.route-table-sync" and "ipv6.route-table-sync" to not change
behavior for users that configured policy routing outside of NetworkManager,
for example, via a dispatcher script. Users had to explicitly opt-in
for NetworkManager to fully manage all routing tables.
These settings were awkward. Replace them with new settings "ipv4.route-table"
and "ipv6.route-table". Note that this commit breaks API/ABI on the unstable
development branch by removing recently added API.
As before, a connection will have no route-table set by default. This
has the meaning that policy-routing is not enabled and only the main table
will be fully synced. Once the user sets a table, we recognize that and
NetworkManager manages all routing tables.
The new route-table setting has other important uses: analog to
"ipv4.route-metric", it is the default that applies to all routes.
Currently it only works for static routes, not DHCP, SLAAC,
default-route, etc. That will be implemented later.
For static routes, each route still can explicitly set a table, and
overwrite the per-connection setting in "ipv4.route-table" and
"ipv6.route-table".
2017-09-28 08:40:41 +02:00
|
|
|
route->metric = route_metric;
|
2017-09-12 13:45:53 +02:00
|
|
|
route->scope_inv = nm_platform_route_scope_inv (NM_RT_SCOPE_LINK);
|
|
|
|
|
|
|
|
|
|
nm_platform_ip_route_normalize (AF_INET, (NMPlatformIPRoute *) route);
|
|
|
|
|
|
|
|
|
|
if (_lookup_route (self,
|
|
|
|
|
r,
|
|
|
|
|
NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID)) {
|
|
|
|
|
/* we already track this route. Don't add it again. */
|
|
|
|
|
} else
|
|
|
|
|
_add_route (self, nmp_object_ref (r), NULL, NULL);
|
2013-07-03 10:26:19 +02:00
|
|
|
|
2017-09-12 13:45:53 +02:00
|
|
|
if ( out_ip4_dev_route_blacklist
|
all: rework configuring route table support by adding "route-table" setting
We added "ipv4.route-table-sync" and "ipv6.route-table-sync" to not change
behavior for users that configured policy routing outside of NetworkManager,
for example, via a dispatcher script. Users had to explicitly opt-in
for NetworkManager to fully manage all routing tables.
These settings were awkward. Replace them with new settings "ipv4.route-table"
and "ipv6.route-table". Note that this commit breaks API/ABI on the unstable
development branch by removing recently added API.
As before, a connection will have no route-table set by default. This
has the meaning that policy-routing is not enabled and only the main table
will be fully synced. Once the user sets a table, we recognize that and
NetworkManager manages all routing tables.
The new route-table setting has other important uses: analog to
"ipv4.route-metric", it is the default that applies to all routes.
Currently it only works for static routes, not DHCP, SLAAC,
default-route, etc. That will be implemented later.
For static routes, each route still can explicitly set a table, and
overwrite the per-connection setting in "ipv4.route-table" and
"ipv6.route-table".
2017-09-28 08:40:41 +02:00
|
|
|
&& route_metric != NM_PLATFORM_ROUTE_METRIC_IP4_DEVICE_ROUTE) {
|
2017-09-12 13:45:53 +02:00
|
|
|
nm_auto_nmpobj NMPObject *r_dev = NULL;
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
|
2017-09-12 13:45:53 +02:00
|
|
|
r_dev = nmp_object_clone (r, FALSE);
|
|
|
|
|
route = NMP_OBJECT_CAST_IP4_ROUTE (r_dev);
|
|
|
|
|
route->metric = NM_PLATFORM_ROUTE_METRIC_IP4_DEVICE_ROUTE;
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
|
|
|
|
|
nm_platform_ip_route_normalize (AF_INET, (NMPlatformIPRoute *) route);
|
|
|
|
|
|
|
|
|
|
if (_lookup_route (self,
|
2017-09-12 13:45:53 +02:00
|
|
|
r_dev,
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID)) {
|
2017-09-12 13:45:53 +02:00
|
|
|
/* we track such a route explicitly. Don't blacklist it. */
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
} else {
|
2017-09-12 13:45:53 +02:00
|
|
|
if (!ip4_dev_route_blacklist)
|
|
|
|
|
ip4_dev_route_blacklist = g_ptr_array_new_with_free_func ((GDestroyNotify) nmp_object_unref);
|
|
|
|
|
|
|
|
|
|
g_ptr_array_add (ip4_dev_route_blacklist,
|
|
|
|
|
g_steal_pointer (&r_dev));
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
}
|
2017-09-12 13:45:53 +02:00
|
|
|
}
|
|
|
|
|
}
|
2017-08-14 14:24:39 +02:00
|
|
|
|
2017-09-12 13:45:53 +02:00
|
|
|
NM_SET_OUT (out_ip4_dev_route_blacklist, ip4_dev_route_blacklist);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
|
|
|
|
nm_ip4_config_commit (const NMIP4Config *self,
|
2017-09-13 17:42:41 +02:00
|
|
|
NMPlatform *platform,
|
|
|
|
|
NMIPRouteTableSyncMode route_table_sync)
|
2017-09-12 13:45:53 +02:00
|
|
|
{
|
|
|
|
|
gs_unref_ptrarray GPtrArray *addresses = NULL;
|
|
|
|
|
gs_unref_ptrarray GPtrArray *routes = NULL;
|
core: inject route list to delete for nm_platform_ip_route_sync()
Whenever we call a platform operation that reads or writes the netlink
socket, there is the possibility that the cache gets updated, as we
receive netlink events.
It is thus racy, if nm_platform_ip_route_sync() *first* adds routes, and
then obtains a list of routes to delete. The correct approach is to
determine which routes to delete first (and keep it in a list
@routes_prune), and pass that list down to nm_platform_ip_route_sync().
Arguably, this doesn't yet solve every race. For example, NMDevice
calls update_ext_ip_config() during ip4_config_merge_and_apply().
That is good, as it resyncs with platform. However, before calling
nm_ip4_config_commit() it calls other platform operations, like
_commit_mtu(). So, the race is still there.
2017-09-22 12:37:12 +02:00
|
|
|
gs_unref_ptrarray GPtrArray *routes_prune = NULL;
|
2017-09-12 13:45:53 +02:00
|
|
|
int ifindex;
|
|
|
|
|
gboolean success = TRUE;
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
|
2017-09-12 13:45:53 +02:00
|
|
|
g_return_val_if_fail (NM_IS_IP4_CONFIG (self), FALSE);
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
|
2017-09-12 13:45:53 +02:00
|
|
|
ifindex = nm_ip4_config_get_ifindex (self);
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
|
2017-09-12 13:45:53 +02:00
|
|
|
addresses = nm_dedup_multi_objs_to_ptr_array_head (nm_ip4_config_lookup_addresses (self),
|
|
|
|
|
NULL, NULL);
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
|
2017-09-12 13:45:53 +02:00
|
|
|
routes = nm_dedup_multi_objs_to_ptr_array_head (nm_ip4_config_lookup_routes (self),
|
|
|
|
|
NULL, NULL);
|
2013-07-03 10:26:19 +02:00
|
|
|
|
core: inject route list to delete for nm_platform_ip_route_sync()
Whenever we call a platform operation that reads or writes the netlink
socket, there is the possibility that the cache gets updated, as we
receive netlink events.
It is thus racy, if nm_platform_ip_route_sync() *first* adds routes, and
then obtains a list of routes to delete. The correct approach is to
determine which routes to delete first (and keep it in a list
@routes_prune), and pass that list down to nm_platform_ip_route_sync().
Arguably, this doesn't yet solve every race. For example, NMDevice
calls update_ext_ip_config() during ip4_config_merge_and_apply().
That is good, as it resyncs with platform. However, before calling
nm_ip4_config_commit() it calls other platform operations, like
_commit_mtu(). So, the race is still there.
2017-09-22 12:37:12 +02:00
|
|
|
routes_prune = nm_platform_ip_route_get_prune_list (platform,
|
|
|
|
|
AF_INET,
|
2017-09-13 17:42:41 +02:00
|
|
|
ifindex,
|
|
|
|
|
route_table_sync);
|
core: inject route list to delete for nm_platform_ip_route_sync()
Whenever we call a platform operation that reads or writes the netlink
socket, there is the possibility that the cache gets updated, as we
receive netlink events.
It is thus racy, if nm_platform_ip_route_sync() *first* adds routes, and
then obtains a list of routes to delete. The correct approach is to
determine which routes to delete first (and keep it in a list
@routes_prune), and pass that list down to nm_platform_ip_route_sync().
Arguably, this doesn't yet solve every race. For example, NMDevice
calls update_ext_ip_config() during ip4_config_merge_and_apply().
That is good, as it resyncs with platform. However, before calling
nm_ip4_config_commit() it calls other platform operations, like
_commit_mtu(). So, the race is still there.
2017-09-22 12:37:12 +02:00
|
|
|
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
nm_platform_ip4_address_sync (platform, ifindex, addresses);
|
2013-07-03 10:26:19 +02:00
|
|
|
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
if (!nm_platform_ip_route_sync (platform,
|
|
|
|
|
AF_INET,
|
|
|
|
|
ifindex,
|
|
|
|
|
routes,
|
core: inject route list to delete for nm_platform_ip_route_sync()
Whenever we call a platform operation that reads or writes the netlink
socket, there is the possibility that the cache gets updated, as we
receive netlink events.
It is thus racy, if nm_platform_ip_route_sync() *first* adds routes, and
then obtains a list of routes to delete. The correct approach is to
determine which routes to delete first (and keep it in a list
@routes_prune), and pass that list down to nm_platform_ip_route_sync().
Arguably, this doesn't yet solve every race. For example, NMDevice
calls update_ext_ip_config() during ip4_config_merge_and_apply().
That is good, as it resyncs with platform. However, before calling
nm_ip4_config_commit() it calls other platform operations, like
_commit_mtu(). So, the race is still there.
2017-09-22 12:37:12 +02:00
|
|
|
routes_prune,
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
NULL))
|
|
|
|
|
success = FALSE;
|
2017-08-14 14:24:39 +02:00
|
|
|
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
return success;
|
2013-07-03 10:26:19 +02:00
|
|
|
}
|
|
|
|
|
|
2017-02-15 15:41:04 +01:00
|
|
|
static void
|
all: rework configuring route table support by adding "route-table" setting
We added "ipv4.route-table-sync" and "ipv6.route-table-sync" to not change
behavior for users that configured policy routing outside of NetworkManager,
for example, via a dispatcher script. Users had to explicitly opt-in
for NetworkManager to fully manage all routing tables.
These settings were awkward. Replace them with new settings "ipv4.route-table"
and "ipv6.route-table". Note that this commit breaks API/ABI on the unstable
development branch by removing recently added API.
As before, a connection will have no route-table set by default. This
has the meaning that policy-routing is not enabled and only the main table
will be fully synced. Once the user sets a table, we recognize that and
NetworkManager manages all routing tables.
The new route-table setting has other important uses: analog to
"ipv4.route-metric", it is the default that applies to all routes.
Currently it only works for static routes, not DHCP, SLAAC,
default-route, etc. That will be implemented later.
For static routes, each route still can explicitly set a table, and
overwrite the per-connection setting in "ipv4.route-table" and
"ipv6.route-table".
2017-09-28 08:40:41 +02:00
|
|
|
merge_route_attributes (NMIPRoute *s_route,
|
|
|
|
|
NMPlatformIP4Route *r,
|
|
|
|
|
guint32 route_table)
|
2017-02-15 15:41:04 +01:00
|
|
|
{
|
|
|
|
|
GVariant *variant;
|
all: rework configuring route table support by adding "route-table" setting
We added "ipv4.route-table-sync" and "ipv6.route-table-sync" to not change
behavior for users that configured policy routing outside of NetworkManager,
for example, via a dispatcher script. Users had to explicitly opt-in
for NetworkManager to fully manage all routing tables.
These settings were awkward. Replace them with new settings "ipv4.route-table"
and "ipv6.route-table". Note that this commit breaks API/ABI on the unstable
development branch by removing recently added API.
As before, a connection will have no route-table set by default. This
has the meaning that policy-routing is not enabled and only the main table
will be fully synced. Once the user sets a table, we recognize that and
NetworkManager manages all routing tables.
The new route-table setting has other important uses: analog to
"ipv4.route-metric", it is the default that applies to all routes.
Currently it only works for static routes, not DHCP, SLAAC,
default-route, etc. That will be implemented later.
For static routes, each route still can explicitly set a table, and
overwrite the per-connection setting in "ipv4.route-table" and
"ipv6.route-table".
2017-09-28 08:40:41 +02:00
|
|
|
guint32 u32;
|
2017-02-15 15:41:04 +01:00
|
|
|
in_addr_t addr;
|
|
|
|
|
|
|
|
|
|
#define GET_ATTR(name, field, variant_type, type) \
|
|
|
|
|
variant = nm_ip_route_get_attribute (s_route, name); \
|
|
|
|
|
if (variant && g_variant_is_of_type (variant, G_VARIANT_TYPE_ ## variant_type)) \
|
|
|
|
|
r->field = g_variant_get_ ## type (variant);
|
|
|
|
|
|
all: rework configuring route table support by adding "route-table" setting
We added "ipv4.route-table-sync" and "ipv6.route-table-sync" to not change
behavior for users that configured policy routing outside of NetworkManager,
for example, via a dispatcher script. Users had to explicitly opt-in
for NetworkManager to fully manage all routing tables.
These settings were awkward. Replace them with new settings "ipv4.route-table"
and "ipv6.route-table". Note that this commit breaks API/ABI on the unstable
development branch by removing recently added API.
As before, a connection will have no route-table set by default. This
has the meaning that policy-routing is not enabled and only the main table
will be fully synced. Once the user sets a table, we recognize that and
NetworkManager manages all routing tables.
The new route-table setting has other important uses: analog to
"ipv4.route-metric", it is the default that applies to all routes.
Currently it only works for static routes, not DHCP, SLAAC,
default-route, etc. That will be implemented later.
For static routes, each route still can explicitly set a table, and
overwrite the per-connection setting in "ipv4.route-table" and
"ipv6.route-table".
2017-09-28 08:40:41 +02:00
|
|
|
variant = nm_ip_route_get_attribute (s_route, NM_IP_ROUTE_ATTRIBUTE_TABLE);
|
|
|
|
|
u32 = variant && g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT32)
|
|
|
|
|
? g_variant_get_uint32 (variant)
|
|
|
|
|
: 0;
|
|
|
|
|
r->table_coerced = nm_platform_route_table_coerce (u32 ?: (route_table ?: RT_TABLE_MAIN));
|
2017-09-13 17:42:41 +02:00
|
|
|
|
2017-02-15 15:41:04 +01:00
|
|
|
GET_ATTR (NM_IP_ROUTE_ATTRIBUTE_TOS, tos, BYTE, byte);
|
|
|
|
|
GET_ATTR (NM_IP_ROUTE_ATTRIBUTE_WINDOW, window, UINT32, uint32);
|
|
|
|
|
GET_ATTR (NM_IP_ROUTE_ATTRIBUTE_CWND, cwnd, UINT32, uint32);
|
|
|
|
|
GET_ATTR (NM_IP_ROUTE_ATTRIBUTE_INITCWND, initcwnd, UINT32, uint32);
|
|
|
|
|
GET_ATTR (NM_IP_ROUTE_ATTRIBUTE_INITRWND, initrwnd, UINT32, uint32);
|
|
|
|
|
GET_ATTR (NM_IP_ROUTE_ATTRIBUTE_MTU, mtu, UINT32, uint32);
|
|
|
|
|
GET_ATTR (NM_IP_ROUTE_ATTRIBUTE_LOCK_WINDOW, lock_window, BOOLEAN, boolean);
|
|
|
|
|
GET_ATTR (NM_IP_ROUTE_ATTRIBUTE_LOCK_CWND, lock_cwnd, BOOLEAN, boolean);
|
|
|
|
|
GET_ATTR (NM_IP_ROUTE_ATTRIBUTE_LOCK_INITCWND, lock_initcwnd, BOOLEAN, boolean);
|
|
|
|
|
GET_ATTR (NM_IP_ROUTE_ATTRIBUTE_LOCK_INITRWND, lock_initrwnd, BOOLEAN, boolean);
|
|
|
|
|
GET_ATTR (NM_IP_ROUTE_ATTRIBUTE_LOCK_MTU, lock_mtu, BOOLEAN, boolean);
|
|
|
|
|
|
2017-03-15 09:29:47 +01:00
|
|
|
if ( (variant = nm_ip_route_get_attribute (s_route, NM_IP_ROUTE_ATTRIBUTE_SRC))
|
2017-02-15 15:41:04 +01:00
|
|
|
&& g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING)) {
|
|
|
|
|
if (inet_pton (AF_INET, g_variant_get_string (variant, NULL), &addr) == 1)
|
|
|
|
|
r->pref_src = addr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#undef GET_ATTR
|
|
|
|
|
}
|
|
|
|
|
|
2008-09-05 02:55:40 +00:00
|
|
|
void
|
all: rework configuring route table support by adding "route-table" setting
We added "ipv4.route-table-sync" and "ipv6.route-table-sync" to not change
behavior for users that configured policy routing outside of NetworkManager,
for example, via a dispatcher script. Users had to explicitly opt-in
for NetworkManager to fully manage all routing tables.
These settings were awkward. Replace them with new settings "ipv4.route-table"
and "ipv6.route-table". Note that this commit breaks API/ABI on the unstable
development branch by removing recently added API.
As before, a connection will have no route-table set by default. This
has the meaning that policy-routing is not enabled and only the main table
will be fully synced. Once the user sets a table, we recognize that and
NetworkManager manages all routing tables.
The new route-table setting has other important uses: analog to
"ipv4.route-metric", it is the default that applies to all routes.
Currently it only works for static routes, not DHCP, SLAAC,
default-route, etc. That will be implemented later.
For static routes, each route still can explicitly set a table, and
overwrite the per-connection setting in "ipv4.route-table" and
"ipv6.route-table".
2017-09-28 08:40:41 +02:00
|
|
|
nm_ip4_config_merge_setting (NMIP4Config *self,
|
|
|
|
|
NMSettingIPConfig *setting,
|
|
|
|
|
guint32 route_table,
|
|
|
|
|
guint32 route_metric)
|
2008-09-05 02:55:40 +00:00
|
|
|
{
|
2015-06-04 15:57:42 +02:00
|
|
|
NMIP4ConfigPrivate *priv;
|
2013-07-12 11:33:52 +02:00
|
|
|
guint naddresses, nroutes, nnameservers, nsearches;
|
2016-04-23 15:57:14 +02:00
|
|
|
int i, priority;
|
2007-02-16 11:23:49 +00:00
|
|
|
|
2013-07-03 10:26:19 +02:00
|
|
|
if (!setting)
|
2013-07-12 11:33:52 +02:00
|
|
|
return;
|
|
|
|
|
|
2014-10-19 17:30:10 -04:00
|
|
|
g_return_if_fail (NM_IS_SETTING_IP4_CONFIG (setting));
|
|
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2015-06-04 15:57:42 +02:00
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
g_object_freeze_notify (G_OBJECT (self));
|
2013-09-06 11:56:41 +02:00
|
|
|
|
2014-10-19 17:30:10 -04:00
|
|
|
naddresses = nm_setting_ip_config_get_num_addresses (setting);
|
|
|
|
|
nroutes = nm_setting_ip_config_get_num_routes (setting);
|
|
|
|
|
nnameservers = nm_setting_ip_config_get_num_dns (setting);
|
|
|
|
|
nsearches = nm_setting_ip_config_get_num_dns_searches (setting);
|
2013-07-12 11:33:52 +02:00
|
|
|
|
|
|
|
|
/* Gateway */
|
2014-10-19 17:30:10 -04:00
|
|
|
if (nm_setting_ip_config_get_never_default (setting))
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_set_never_default (self, TRUE);
|
2014-10-19 17:30:10 -04:00
|
|
|
else if (nm_setting_ip_config_get_ignore_auto_routes (setting))
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_set_never_default (self, FALSE);
|
2014-10-20 21:30:56 -04:00
|
|
|
if (nm_setting_ip_config_get_gateway (setting)) {
|
2014-09-16 16:42:46 -04:00
|
|
|
guint32 gateway;
|
2013-07-12 11:33:52 +02:00
|
|
|
|
2014-10-20 21:30:56 -04:00
|
|
|
inet_pton (AF_INET, nm_setting_ip_config_get_gateway (setting), &gateway);
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_set_gateway (self, gateway);
|
2013-07-03 10:26:19 +02:00
|
|
|
}
|
|
|
|
|
|
2015-06-04 15:57:42 +02:00
|
|
|
if (priv->route_metric == -1)
|
|
|
|
|
priv->route_metric = nm_setting_ip_config_get_route_metric (setting);
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
/* Addresses */
|
2013-06-29 13:33:36 +02:00
|
|
|
for (i = 0; i < naddresses; i++) {
|
2014-10-19 17:30:10 -04:00
|
|
|
NMIPAddress *s_addr = nm_setting_ip_config_get_address (setting, i);
|
2014-09-16 16:38:04 -04:00
|
|
|
GVariant *label;
|
2013-06-29 13:33:36 +02:00
|
|
|
NMPlatformIP4Address address;
|
|
|
|
|
|
|
|
|
|
memset (&address, 0, sizeof (address));
|
2014-09-16 16:42:46 -04:00
|
|
|
nm_ip_address_get_address_binary (s_addr, &address.address);
|
2015-10-21 23:17:11 +02:00
|
|
|
address.peer_address = address.address;
|
2014-09-16 16:42:46 -04:00
|
|
|
address.plen = nm_ip_address_get_prefix (s_addr);
|
2016-04-06 18:04:26 +02:00
|
|
|
nm_assert (address.plen <= 32);
|
2013-07-04 20:40:18 +02:00
|
|
|
address.lifetime = NM_PLATFORM_LIFETIME_PERMANENT;
|
|
|
|
|
address.preferred = NM_PLATFORM_LIFETIME_PERMANENT;
|
2016-04-11 13:09:52 +02:00
|
|
|
address.addr_source = NM_IP_CONFIG_SOURCE_USER;
|
2014-09-16 16:38:04 -04:00
|
|
|
|
|
|
|
|
label = nm_ip_address_get_attribute (s_addr, "label");
|
|
|
|
|
if (label)
|
|
|
|
|
g_strlcpy (address.label, g_variant_get_string (label, NULL), sizeof (address.label));
|
2013-06-29 13:33:36 +02:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
_add_address (self, NULL, &address);
|
2013-06-29 13:33:36 +02:00
|
|
|
}
|
2013-07-03 10:26:19 +02:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
/* Routes */
|
2014-10-19 17:30:10 -04:00
|
|
|
if (nm_setting_ip_config_get_ignore_auto_routes (setting))
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_reset_routes (self);
|
2013-07-31 23:07:32 +02:00
|
|
|
for (i = 0; i < nroutes; i++) {
|
2014-10-19 17:30:10 -04:00
|
|
|
NMIPRoute *s_route = nm_setting_ip_config_get_route (setting, i);
|
2013-07-31 23:07:32 +02:00
|
|
|
NMPlatformIP4Route route;
|
|
|
|
|
|
2017-08-23 14:43:15 +02:00
|
|
|
if (nm_ip_route_get_family (s_route) != AF_INET) {
|
|
|
|
|
nm_assert_not_reached ();
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2013-07-31 23:07:32 +02:00
|
|
|
memset (&route, 0, sizeof (route));
|
2014-09-16 16:42:46 -04:00
|
|
|
nm_ip_route_get_dest_binary (s_route, &route.network);
|
2016-04-06 14:19:05 +02:00
|
|
|
|
2014-09-16 16:42:46 -04:00
|
|
|
route.plen = nm_ip_route_get_prefix (s_route);
|
2016-04-06 14:19:05 +02:00
|
|
|
nm_assert (route.plen <= 32);
|
|
|
|
|
if (route.plen == 0)
|
|
|
|
|
continue;
|
|
|
|
|
|
2014-09-16 16:42:46 -04:00
|
|
|
nm_ip_route_get_next_hop_binary (s_route, &route.gateway);
|
2014-11-04 15:48:48 -05:00
|
|
|
if (nm_ip_route_get_metric (s_route) == -1)
|
all: rework configuring route table support by adding "route-table" setting
We added "ipv4.route-table-sync" and "ipv6.route-table-sync" to not change
behavior for users that configured policy routing outside of NetworkManager,
for example, via a dispatcher script. Users had to explicitly opt-in
for NetworkManager to fully manage all routing tables.
These settings were awkward. Replace them with new settings "ipv4.route-table"
and "ipv6.route-table". Note that this commit breaks API/ABI on the unstable
development branch by removing recently added API.
As before, a connection will have no route-table set by default. This
has the meaning that policy-routing is not enabled and only the main table
will be fully synced. Once the user sets a table, we recognize that and
NetworkManager manages all routing tables.
The new route-table setting has other important uses: analog to
"ipv4.route-metric", it is the default that applies to all routes.
Currently it only works for static routes, not DHCP, SLAAC,
default-route, etc. That will be implemented later.
For static routes, each route still can explicitly set a table, and
overwrite the per-connection setting in "ipv4.route-table" and
"ipv6.route-table".
2017-09-28 08:40:41 +02:00
|
|
|
route.metric = route_metric;
|
2014-11-04 15:48:48 -05:00
|
|
|
else
|
|
|
|
|
route.metric = nm_ip_route_get_metric (s_route);
|
2016-04-11 13:09:52 +02:00
|
|
|
route.rt_source = NM_IP_CONFIG_SOURCE_USER;
|
2013-07-31 23:07:32 +02:00
|
|
|
|
2017-07-19 11:30:13 +02:00
|
|
|
route.network = nm_utils_ip4_address_clear_host_address (route.network, route.plen);
|
|
|
|
|
|
all: rework configuring route table support by adding "route-table" setting
We added "ipv4.route-table-sync" and "ipv6.route-table-sync" to not change
behavior for users that configured policy routing outside of NetworkManager,
for example, via a dispatcher script. Users had to explicitly opt-in
for NetworkManager to fully manage all routing tables.
These settings were awkward. Replace them with new settings "ipv4.route-table"
and "ipv6.route-table". Note that this commit breaks API/ABI on the unstable
development branch by removing recently added API.
As before, a connection will have no route-table set by default. This
has the meaning that policy-routing is not enabled and only the main table
will be fully synced. Once the user sets a table, we recognize that and
NetworkManager manages all routing tables.
The new route-table setting has other important uses: analog to
"ipv4.route-metric", it is the default that applies to all routes.
Currently it only works for static routes, not DHCP, SLAAC,
default-route, etc. That will be implemented later.
For static routes, each route still can explicitly set a table, and
overwrite the per-connection setting in "ipv4.route-table" and
"ipv6.route-table".
2017-09-28 08:40:41 +02:00
|
|
|
merge_route_attributes (s_route, &route, route_table);
|
2017-09-05 10:36:50 +02:00
|
|
|
_add_route (self, NULL, &route, NULL);
|
2013-07-31 23:07:32 +02:00
|
|
|
}
|
2013-07-12 11:33:52 +02:00
|
|
|
|
|
|
|
|
/* DNS */
|
2014-10-19 17:30:10 -04:00
|
|
|
if (nm_setting_ip_config_get_ignore_auto_dns (setting)) {
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_reset_nameservers (self);
|
|
|
|
|
nm_ip4_config_reset_domains (self);
|
|
|
|
|
nm_ip4_config_reset_searches (self);
|
2013-07-03 10:26:19 +02:00
|
|
|
}
|
2014-06-24 12:46:03 -04:00
|
|
|
for (i = 0; i < nnameservers; i++) {
|
|
|
|
|
guint32 ip;
|
|
|
|
|
|
2014-10-19 17:30:10 -04:00
|
|
|
if (inet_pton (AF_INET, nm_setting_ip_config_get_dns (setting, i), &ip) == 1)
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_add_nameserver (self, ip);
|
2014-06-24 12:46:03 -04:00
|
|
|
}
|
2013-07-12 11:33:52 +02:00
|
|
|
for (i = 0; i < nsearches; i++)
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_add_search (self, nm_setting_ip_config_get_dns_search (setting, i));
|
2013-09-06 11:56:41 +02:00
|
|
|
|
2015-03-26 09:23:12 +01:00
|
|
|
i = 0;
|
|
|
|
|
while ((i = nm_setting_ip_config_next_valid_dns_option (setting, i)) >= 0) {
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_add_dns_option (self, nm_setting_ip_config_get_dns_option (setting, i));
|
2015-03-26 09:23:12 +01:00
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
|
2016-04-23 15:57:14 +02:00
|
|
|
priority = nm_setting_ip_config_get_dns_priority (setting);
|
|
|
|
|
if (priority)
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_set_dns_priority (self, priority);
|
2016-04-23 15:57:14 +02:00
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
g_object_thaw_notify (G_OBJECT (self));
|
2008-09-05 02:55:40 +00:00
|
|
|
}
|
2005-04-15 15:43:42 +00:00
|
|
|
|
2014-05-19 10:24:15 -04:00
|
|
|
NMSetting *
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_create_setting (const NMIP4Config *self)
|
2013-07-25 23:36:36 +02:00
|
|
|
{
|
2014-10-19 17:30:10 -04:00
|
|
|
NMSettingIPConfig *s_ip4;
|
2013-07-25 23:36:36 +02:00
|
|
|
guint32 gateway;
|
2017-07-07 23:34:41 +02:00
|
|
|
guint nnameservers, nsearches, noptions;
|
2013-07-25 23:36:36 +02:00
|
|
|
const char *method = NULL;
|
|
|
|
|
int i;
|
2015-06-04 15:57:42 +02:00
|
|
|
gint64 route_metric;
|
2017-06-12 18:40:14 +02:00
|
|
|
NMDedupMultiIter ipconf_iter;
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMPlatformIP4Address *address;
|
2017-06-12 18:40:14 +02:00
|
|
|
const NMPlatformIP4Route *route;
|
2013-07-25 23:36:36 +02:00
|
|
|
|
2014-10-19 17:30:10 -04:00
|
|
|
s_ip4 = NM_SETTING_IP_CONFIG (nm_setting_ip4_config_new ());
|
2014-05-19 10:24:15 -04:00
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
if (!self) {
|
2014-05-19 10:24:15 -04:00
|
|
|
g_object_set (s_ip4,
|
2014-10-19 17:30:10 -04:00
|
|
|
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
|
2014-05-19 10:24:15 -04:00
|
|
|
NULL);
|
|
|
|
|
return NM_SETTING (s_ip4);
|
|
|
|
|
}
|
2013-07-25 23:36:36 +02:00
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
gateway = nm_ip4_config_get_gateway (self);
|
|
|
|
|
nnameservers = nm_ip4_config_get_num_nameservers (self);
|
|
|
|
|
nsearches = nm_ip4_config_get_num_searches (self);
|
|
|
|
|
noptions = nm_ip4_config_get_num_dns_options (self);
|
|
|
|
|
route_metric = nm_ip4_config_get_route_metric (self);
|
2013-07-25 23:36:36 +02:00
|
|
|
|
|
|
|
|
/* Addresses */
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_iter_ip4_address_for_each (&ipconf_iter, self, &address) {
|
2014-09-16 16:42:46 -04:00
|
|
|
NMIPAddress *s_addr;
|
2013-07-25 23:36:36 +02:00
|
|
|
|
2013-07-04 20:40:18 +02:00
|
|
|
/* Detect dynamic address */
|
|
|
|
|
if (address->lifetime != NM_PLATFORM_LIFETIME_PERMANENT) {
|
|
|
|
|
method = NM_SETTING_IP4_CONFIG_METHOD_AUTO;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2013-07-25 23:36:36 +02:00
|
|
|
/* Static address found. */
|
|
|
|
|
if (!method)
|
|
|
|
|
method = NM_SETTING_IP4_CONFIG_METHOD_MANUAL;
|
|
|
|
|
|
2014-10-20 21:30:56 -04:00
|
|
|
s_addr = nm_ip_address_new_binary (AF_INET, &address->address, address->plen, NULL);
|
2014-09-16 16:38:04 -04:00
|
|
|
if (*address->label)
|
|
|
|
|
nm_ip_address_set_attribute (s_addr, "label", g_variant_new_string (address->label));
|
|
|
|
|
|
2014-10-19 17:30:10 -04:00
|
|
|
nm_setting_ip_config_add_address (s_ip4, s_addr);
|
2014-09-16 16:42:46 -04:00
|
|
|
nm_ip_address_unref (s_addr);
|
2013-07-25 23:36:36 +02:00
|
|
|
}
|
2013-11-08 00:29:38 -06:00
|
|
|
|
2014-10-20 21:30:56 -04:00
|
|
|
/* Gateway */
|
2017-07-10 14:03:44 +02:00
|
|
|
if ( nm_ip4_config_has_gateway (self)
|
2014-11-07 16:34:13 +01:00
|
|
|
&& nm_setting_ip_config_get_num_addresses (s_ip4) > 0) {
|
2014-10-20 21:30:56 -04:00
|
|
|
g_object_set (s_ip4,
|
|
|
|
|
NM_SETTING_IP_CONFIG_GATEWAY, nm_utils_inet4_ntop (gateway, NULL),
|
|
|
|
|
NULL);
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-19 10:24:15 -04:00
|
|
|
/* Use 'disabled' if the method wasn't previously set */
|
|
|
|
|
if (!method)
|
2013-07-25 23:36:36 +02:00
|
|
|
method = NM_SETTING_IP4_CONFIG_METHOD_DISABLED;
|
2015-06-04 15:57:42 +02:00
|
|
|
|
|
|
|
|
g_object_set (s_ip4,
|
|
|
|
|
NM_SETTING_IP_CONFIG_METHOD, method,
|
|
|
|
|
NM_SETTING_IP_CONFIG_ROUTE_METRIC, (gint64) route_metric,
|
|
|
|
|
NULL);
|
2013-07-25 23:36:36 +02:00
|
|
|
|
|
|
|
|
/* Routes */
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_iter_ip4_route_for_each (&ipconf_iter, self, &route) {
|
2014-09-16 16:42:46 -04:00
|
|
|
NMIPRoute *s_route;
|
2013-07-25 23:36:36 +02:00
|
|
|
|
2017-08-31 13:39:04 +02:00
|
|
|
if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT (route))
|
2013-07-25 23:36:36 +02:00
|
|
|
continue;
|
|
|
|
|
|
2014-05-08 14:56:59 -04:00
|
|
|
/* Ignore routes provided by external sources */
|
2016-05-16 09:36:09 +02:00
|
|
|
if (route->rt_source != nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER))
|
2014-05-08 14:56:59 -04:00
|
|
|
continue;
|
|
|
|
|
|
2014-09-16 16:42:46 -04:00
|
|
|
s_route = nm_ip_route_new_binary (AF_INET,
|
|
|
|
|
&route->network, route->plen,
|
|
|
|
|
&route->gateway, route->metric,
|
|
|
|
|
NULL);
|
2014-10-19 17:30:10 -04:00
|
|
|
nm_setting_ip_config_add_route (s_ip4, s_route);
|
2014-09-16 16:42:46 -04:00
|
|
|
nm_ip_route_unref (s_route);
|
2013-07-25 23:36:36 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* DNS */
|
|
|
|
|
for (i = 0; i < nnameservers; i++) {
|
2017-07-10 14:03:44 +02:00
|
|
|
guint32 nameserver = nm_ip4_config_get_nameserver (self, i);
|
2013-07-25 23:36:36 +02:00
|
|
|
|
2014-10-19 17:30:10 -04:00
|
|
|
nm_setting_ip_config_add_dns (s_ip4, nm_utils_inet4_ntop (nameserver, NULL));
|
2013-07-25 23:36:36 +02:00
|
|
|
}
|
|
|
|
|
for (i = 0; i < nsearches; i++) {
|
2017-07-10 14:03:44 +02:00
|
|
|
const char *search = nm_ip4_config_get_search (self, i);
|
2013-07-25 23:36:36 +02:00
|
|
|
|
2014-10-19 17:30:10 -04:00
|
|
|
nm_setting_ip_config_add_dns_search (s_ip4, search);
|
2013-07-25 23:36:36 +02:00
|
|
|
}
|
2014-05-19 10:24:15 -04:00
|
|
|
|
2015-03-26 09:23:12 +01:00
|
|
|
for (i = 0; i < noptions; i++) {
|
2017-07-10 14:03:44 +02:00
|
|
|
const char *option = nm_ip4_config_get_dns_option (self, i);
|
2015-03-26 09:23:12 +01:00
|
|
|
|
|
|
|
|
nm_setting_ip_config_add_dns_option (s_ip4, option);
|
|
|
|
|
}
|
|
|
|
|
|
2016-04-23 15:57:14 +02:00
|
|
|
g_object_set (s_ip4,
|
|
|
|
|
NM_SETTING_IP_CONFIG_DNS_PRIORITY,
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_dns_priority (self),
|
2016-04-23 15:57:14 +02:00
|
|
|
NULL);
|
|
|
|
|
|
2014-05-19 10:24:15 -04:00
|
|
|
return NM_SETTING (s_ip4);
|
2013-07-25 23:36:36 +02:00
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-07-03 10:26:19 +02:00
|
|
|
|
2013-08-01 10:34:46 -05:00
|
|
|
void
|
2015-08-05 10:01:39 +02:00
|
|
|
nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src, NMIPConfigMergeFlags merge_flags)
|
2013-08-01 10:34:46 -05:00
|
|
|
{
|
2016-05-11 18:50:10 +02:00
|
|
|
NMIP4ConfigPrivate *dst_priv;
|
|
|
|
|
const NMIP4ConfigPrivate *src_priv;
|
2013-08-01 10:34:46 -05:00
|
|
|
guint32 i;
|
2017-06-12 18:40:14 +02:00
|
|
|
NMDedupMultiIter ipconf_iter;
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMPlatformIP4Address *address = NULL;
|
2013-08-01 10:34:46 -05:00
|
|
|
|
|
|
|
|
g_return_if_fail (src != NULL);
|
|
|
|
|
g_return_if_fail (dst != NULL);
|
|
|
|
|
|
2015-06-04 15:57:42 +02:00
|
|
|
dst_priv = NM_IP4_CONFIG_GET_PRIVATE (dst);
|
|
|
|
|
src_priv = NM_IP4_CONFIG_GET_PRIVATE (src);
|
|
|
|
|
|
2013-09-06 11:56:41 +02:00
|
|
|
g_object_freeze_notify (G_OBJECT (dst));
|
|
|
|
|
|
2013-08-01 10:34:46 -05:00
|
|
|
/* addresses */
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_iter_ip4_address_for_each (&ipconf_iter, src, &address)
|
|
|
|
|
_add_address (dst, NMP_OBJECT_UP_CAST (address), NULL);
|
2013-08-01 10:34:46 -05:00
|
|
|
|
|
|
|
|
/* nameservers */
|
2015-08-05 10:01:39 +02:00
|
|
|
if (!NM_FLAGS_HAS (merge_flags, NM_IP_CONFIG_MERGE_NO_DNS)) {
|
|
|
|
|
for (i = 0; i < nm_ip4_config_get_num_nameservers (src); i++)
|
|
|
|
|
nm_ip4_config_add_nameserver (dst, nm_ip4_config_get_nameserver (src, i));
|
|
|
|
|
}
|
2013-08-01 10:34:46 -05:00
|
|
|
|
|
|
|
|
/* default gateway */
|
2015-07-21 23:07:34 +02:00
|
|
|
if (nm_ip4_config_has_gateway (src))
|
2013-08-01 10:34:46 -05:00
|
|
|
nm_ip4_config_set_gateway (dst, nm_ip4_config_get_gateway (src));
|
|
|
|
|
|
|
|
|
|
/* routes */
|
2015-08-05 10:01:39 +02:00
|
|
|
if (!NM_FLAGS_HAS (merge_flags, NM_IP_CONFIG_MERGE_NO_ROUTES)) {
|
2017-08-31 13:39:04 +02:00
|
|
|
nm_ip_config_iter_ip4_route_for_each (&ipconf_iter, src, NULL)
|
|
|
|
|
_add_route (dst, ipconf_iter.current->obj, NULL, NULL);
|
2015-08-05 10:01:39 +02:00
|
|
|
}
|
2013-08-01 10:34:46 -05:00
|
|
|
|
2015-06-04 15:57:42 +02:00
|
|
|
if (dst_priv->route_metric == -1)
|
|
|
|
|
dst_priv->route_metric = src_priv->route_metric;
|
2015-07-22 14:17:08 +02:00
|
|
|
else if (src_priv->route_metric != -1)
|
2015-06-04 15:57:42 +02:00
|
|
|
dst_priv->route_metric = MIN (dst_priv->route_metric, src_priv->route_metric);
|
|
|
|
|
|
2013-08-01 10:34:46 -05:00
|
|
|
/* domains */
|
2015-08-05 10:01:39 +02:00
|
|
|
if (!NM_FLAGS_HAS (merge_flags, NM_IP_CONFIG_MERGE_NO_DNS)) {
|
|
|
|
|
for (i = 0; i < nm_ip4_config_get_num_domains (src); i++)
|
|
|
|
|
nm_ip4_config_add_domain (dst, nm_ip4_config_get_domain (src, i));
|
|
|
|
|
}
|
2013-08-01 10:34:46 -05:00
|
|
|
|
|
|
|
|
/* dns searches */
|
2015-08-05 10:01:39 +02:00
|
|
|
if (!NM_FLAGS_HAS (merge_flags, NM_IP_CONFIG_MERGE_NO_DNS)) {
|
|
|
|
|
for (i = 0; i < nm_ip4_config_get_num_searches (src); i++)
|
|
|
|
|
nm_ip4_config_add_search (dst, nm_ip4_config_get_search (src, i));
|
|
|
|
|
}
|
2013-08-01 10:34:46 -05:00
|
|
|
|
2015-03-26 09:23:12 +01:00
|
|
|
/* dns options */
|
2015-08-05 10:01:39 +02:00
|
|
|
if (!NM_FLAGS_HAS (merge_flags, NM_IP_CONFIG_MERGE_NO_DNS)) {
|
|
|
|
|
for (i = 0; i < nm_ip4_config_get_num_dns_options (src); i++)
|
|
|
|
|
nm_ip4_config_add_dns_option (dst, nm_ip4_config_get_dns_option (src, i));
|
|
|
|
|
}
|
2015-03-26 09:23:12 +01:00
|
|
|
|
2014-04-17 11:15:36 +02:00
|
|
|
/* MSS */
|
2015-06-28 21:15:12 +02:00
|
|
|
if (nm_ip4_config_get_mss (src))
|
2013-08-01 10:34:46 -05:00
|
|
|
nm_ip4_config_set_mss (dst, nm_ip4_config_get_mss (src));
|
|
|
|
|
|
2014-04-17 11:15:36 +02:00
|
|
|
/* MTU */
|
2017-01-15 12:57:50 +01:00
|
|
|
if ( src_priv->mtu_source > dst_priv->mtu_source
|
|
|
|
|
|| ( src_priv->mtu_source == dst_priv->mtu_source
|
|
|
|
|
&& ( (!dst_priv->mtu && src_priv->mtu)
|
|
|
|
|
|| (dst_priv->mtu && src_priv->mtu < dst_priv->mtu))))
|
|
|
|
|
nm_ip4_config_set_mtu (dst, src_priv->mtu, src_priv->mtu_source);
|
2014-04-17 11:15:36 +02:00
|
|
|
|
2013-08-01 10:34:46 -05:00
|
|
|
/* NIS */
|
2015-08-05 10:01:39 +02:00
|
|
|
if (!NM_FLAGS_HAS (merge_flags, NM_IP_CONFIG_MERGE_NO_DNS)) {
|
|
|
|
|
for (i = 0; i < nm_ip4_config_get_num_nis_servers (src); i++)
|
|
|
|
|
nm_ip4_config_add_nis_server (dst, nm_ip4_config_get_nis_server (src, i));
|
2013-08-01 10:34:46 -05:00
|
|
|
|
2015-08-05 10:01:39 +02:00
|
|
|
if (nm_ip4_config_get_nis_domain (src))
|
|
|
|
|
nm_ip4_config_set_nis_domain (dst, nm_ip4_config_get_nis_domain (src));
|
|
|
|
|
}
|
2013-08-01 10:34:46 -05:00
|
|
|
|
|
|
|
|
/* WINS */
|
2015-08-05 10:01:39 +02:00
|
|
|
if (!NM_FLAGS_HAS (merge_flags, NM_IP_CONFIG_MERGE_NO_DNS)) {
|
|
|
|
|
for (i = 0; i < nm_ip4_config_get_num_wins (src); i++)
|
|
|
|
|
nm_ip4_config_add_wins (dst, nm_ip4_config_get_wins (src, i));
|
|
|
|
|
}
|
2013-09-06 11:56:41 +02:00
|
|
|
|
2015-04-30 18:11:16 +02:00
|
|
|
/* metered flag */
|
|
|
|
|
nm_ip4_config_set_metered (dst, nm_ip4_config_get_metered (dst) ||
|
|
|
|
|
nm_ip4_config_get_metered (src));
|
|
|
|
|
|
2016-04-23 15:57:14 +02:00
|
|
|
/* DNS priority */
|
|
|
|
|
if (nm_ip4_config_get_dns_priority (src))
|
|
|
|
|
nm_ip4_config_set_dns_priority (dst, nm_ip4_config_get_dns_priority (src));
|
|
|
|
|
|
2013-09-06 11:56:41 +02:00
|
|
|
g_object_thaw_notify (G_OBJECT (dst));
|
2013-08-01 10:34:46 -05:00
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2014-11-20 23:36:50 +01:00
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
_nameservers_get_index (const NMIP4Config *self, guint32 ns)
|
|
|
|
|
{
|
2016-05-11 18:50:10 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2014-11-20 23:36:50 +01:00
|
|
|
guint i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < priv->nameservers->len; i++) {
|
|
|
|
|
guint32 n = g_array_index (priv->nameservers, guint32, i);
|
|
|
|
|
|
|
|
|
|
if (ns == n)
|
|
|
|
|
return (int) i;
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
_domains_get_index (const NMIP4Config *self, const char *domain)
|
|
|
|
|
{
|
2016-05-11 18:50:10 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2014-11-20 23:36:50 +01:00
|
|
|
guint i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < priv->domains->len; i++) {
|
|
|
|
|
const char *d = g_ptr_array_index (priv->domains, i);
|
|
|
|
|
|
|
|
|
|
if (g_strcmp0 (domain, d) == 0)
|
|
|
|
|
return (int) i;
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
_searches_get_index (const NMIP4Config *self, const char *search)
|
|
|
|
|
{
|
2016-05-11 18:50:10 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2014-11-20 23:36:50 +01:00
|
|
|
guint i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < priv->searches->len; i++) {
|
|
|
|
|
const char *s = g_ptr_array_index (priv->searches, i);
|
|
|
|
|
|
|
|
|
|
if (g_strcmp0 (search, s) == 0)
|
|
|
|
|
return (int) i;
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-26 09:23:12 +01:00
|
|
|
static int
|
|
|
|
|
_dns_options_get_index (const NMIP4Config *self, const char *option)
|
|
|
|
|
{
|
2016-05-11 18:50:10 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2015-03-26 09:23:12 +01:00
|
|
|
guint i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < priv->dns_options->len; i++) {
|
|
|
|
|
const char *s = g_ptr_array_index (priv->dns_options, i);
|
|
|
|
|
|
|
|
|
|
if (g_strcmp0 (option, s) == 0)
|
|
|
|
|
return (int) i;
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-20 23:36:50 +01:00
|
|
|
static int
|
|
|
|
|
_nis_servers_get_index (const NMIP4Config *self, guint32 nis_server)
|
|
|
|
|
{
|
2016-05-11 18:50:10 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2014-11-20 23:36:50 +01:00
|
|
|
guint i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < priv->nis->len; i++) {
|
|
|
|
|
guint32 n = g_array_index (priv->nis, guint32, i);
|
|
|
|
|
|
|
|
|
|
if (n == nis_server)
|
|
|
|
|
return (int) i;
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
_wins_get_index (const NMIP4Config *self, guint32 wins_server)
|
|
|
|
|
{
|
2016-05-11 18:50:10 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2014-11-20 23:36:50 +01:00
|
|
|
guint i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < priv->wins->len; i++) {
|
|
|
|
|
guint32 n = g_array_index (priv->wins, guint32, i);
|
|
|
|
|
|
|
|
|
|
if (n == wins_server)
|
|
|
|
|
return (int) i;
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2014-11-20 23:36:50 +01:00
|
|
|
|
2013-08-01 14:04:35 -05:00
|
|
|
/**
|
2013-09-06 11:02:03 +02:00
|
|
|
* nm_ip4_config_subtract:
|
2013-08-01 14:04:35 -05:00
|
|
|
* @dst: config from which to remove everything in @src
|
|
|
|
|
* @src: config to remove from @dst
|
|
|
|
|
*
|
|
|
|
|
* Removes everything in @src from @dst.
|
|
|
|
|
*/
|
|
|
|
|
void
|
2013-09-25 13:08:53 +02:00
|
|
|
nm_ip4_config_subtract (NMIP4Config *dst, const NMIP4Config *src)
|
2013-08-01 14:04:35 -05:00
|
|
|
{
|
2017-08-30 11:39:07 +02:00
|
|
|
NMIP4ConfigPrivate *dst_priv;
|
2017-06-12 18:40:14 +02:00
|
|
|
guint i;
|
2014-11-20 23:36:50 +01:00
|
|
|
gint idx;
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMPlatformIP4Address *a;
|
2017-06-12 18:40:14 +02:00
|
|
|
const NMPlatformIP4Route *r;
|
|
|
|
|
NMDedupMultiIter ipconf_iter;
|
2017-07-07 23:34:41 +02:00
|
|
|
gboolean changed;
|
2017-08-31 13:39:04 +02:00
|
|
|
gboolean changed_default_route;
|
2013-08-01 14:04:35 -05:00
|
|
|
|
|
|
|
|
g_return_if_fail (src != NULL);
|
|
|
|
|
g_return_if_fail (dst != NULL);
|
|
|
|
|
|
2017-08-30 11:39:07 +02:00
|
|
|
dst_priv = NM_IP4_CONFIG_GET_PRIVATE (dst);
|
2017-06-12 18:40:14 +02:00
|
|
|
|
2013-09-06 11:56:41 +02:00
|
|
|
g_object_freeze_notify (G_OBJECT (dst));
|
|
|
|
|
|
2013-08-01 14:04:35 -05:00
|
|
|
/* addresses */
|
2017-07-07 23:34:41 +02:00
|
|
|
changed = FALSE;
|
|
|
|
|
nm_ip_config_iter_ip4_address_for_each (&ipconf_iter, src, &a) {
|
2017-08-30 11:39:07 +02:00
|
|
|
if (nm_dedup_multi_index_remove_obj (dst_priv->multi_idx,
|
|
|
|
|
&dst_priv->idx_ip4_addresses,
|
2017-08-23 16:00:11 +02:00
|
|
|
NMP_OBJECT_UP_CAST (a),
|
|
|
|
|
NULL))
|
2017-07-07 23:34:41 +02:00
|
|
|
changed = TRUE;
|
2013-08-01 14:04:35 -05:00
|
|
|
}
|
2017-07-07 23:34:41 +02:00
|
|
|
if (changed)
|
|
|
|
|
_notify_addresses (dst);
|
2013-08-01 14:04:35 -05:00
|
|
|
|
|
|
|
|
/* nameservers */
|
|
|
|
|
for (i = 0; i < nm_ip4_config_get_num_nameservers (src); i++) {
|
2014-11-20 23:36:50 +01:00
|
|
|
idx = _nameservers_get_index (dst, nm_ip4_config_get_nameserver (src, i));
|
|
|
|
|
if (idx >= 0)
|
|
|
|
|
nm_ip4_config_del_nameserver (dst, idx);
|
2013-08-01 14:04:35 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* default gateway */
|
2015-07-21 23:07:34 +02:00
|
|
|
if ( (nm_ip4_config_has_gateway (src) == nm_ip4_config_has_gateway (dst))
|
|
|
|
|
&& (nm_ip4_config_get_gateway (src) == nm_ip4_config_get_gateway (dst)))
|
|
|
|
|
nm_ip4_config_unset_gateway (dst);
|
2013-08-01 14:04:35 -05:00
|
|
|
|
2014-11-07 16:34:13 +01:00
|
|
|
if (!nm_ip4_config_get_num_addresses (dst))
|
2015-07-21 23:07:34 +02:00
|
|
|
nm_ip4_config_unset_gateway (dst);
|
2014-11-07 16:34:13 +01:00
|
|
|
|
2015-06-04 15:57:42 +02:00
|
|
|
/* ignore route_metric */
|
|
|
|
|
|
2013-08-01 14:04:35 -05:00
|
|
|
/* routes */
|
2017-07-07 23:34:41 +02:00
|
|
|
changed = FALSE;
|
2017-08-31 13:39:04 +02:00
|
|
|
changed_default_route = FALSE;
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_iter_ip4_route_for_each (&ipconf_iter, src, &r) {
|
2017-08-31 13:39:04 +02:00
|
|
|
nm_auto_nmpobj const NMPObject *obj_old = NULL;
|
|
|
|
|
|
2017-08-30 11:39:07 +02:00
|
|
|
if (nm_dedup_multi_index_remove_obj (dst_priv->multi_idx,
|
|
|
|
|
&dst_priv->idx_ip4_routes,
|
2017-08-23 16:00:11 +02:00
|
|
|
NMP_OBJECT_UP_CAST (r),
|
2017-08-31 13:39:04 +02:00
|
|
|
(gconstpointer *) &obj_old)) {
|
|
|
|
|
if (dst_priv->best_default_route == obj_old) {
|
|
|
|
|
nm_clear_nmp_object (&dst_priv->best_default_route);
|
|
|
|
|
changed_default_route = TRUE;
|
|
|
|
|
}
|
2017-07-07 23:34:41 +02:00
|
|
|
changed = TRUE;
|
2017-08-31 13:39:04 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (changed_default_route) {
|
|
|
|
|
_nm_ip_config_best_default_route_set (&dst_priv->best_default_route,
|
|
|
|
|
_nm_ip4_config_best_default_route_find (dst));
|
2013-08-01 14:04:35 -05:00
|
|
|
}
|
2017-07-07 23:34:41 +02:00
|
|
|
if (changed)
|
|
|
|
|
_notify_routes (dst);
|
2013-08-01 14:04:35 -05:00
|
|
|
|
|
|
|
|
/* domains */
|
|
|
|
|
for (i = 0; i < nm_ip4_config_get_num_domains (src); i++) {
|
2014-11-20 23:36:50 +01:00
|
|
|
idx = _domains_get_index (dst, nm_ip4_config_get_domain (src, i));
|
|
|
|
|
if (idx >= 0)
|
|
|
|
|
nm_ip4_config_del_domain (dst, idx);
|
2013-08-01 14:04:35 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* dns searches */
|
|
|
|
|
for (i = 0; i < nm_ip4_config_get_num_searches (src); i++) {
|
2014-11-20 23:36:50 +01:00
|
|
|
idx = _searches_get_index (dst, nm_ip4_config_get_search (src, i));
|
|
|
|
|
if (idx >= 0)
|
|
|
|
|
nm_ip4_config_del_search (dst, idx);
|
2013-08-01 14:04:35 -05:00
|
|
|
}
|
|
|
|
|
|
2015-03-26 09:23:12 +01:00
|
|
|
/* dns options */
|
|
|
|
|
for (i = 0; i < nm_ip4_config_get_num_dns_options (src); i++) {
|
|
|
|
|
idx = _dns_options_get_index (dst, nm_ip4_config_get_dns_option (src, i));
|
|
|
|
|
if (idx >= 0)
|
|
|
|
|
nm_ip4_config_del_dns_option (dst, idx);
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-17 11:15:36 +02:00
|
|
|
/* MSS */
|
2013-08-01 14:04:35 -05:00
|
|
|
if (nm_ip4_config_get_mss (src) == nm_ip4_config_get_mss (dst))
|
|
|
|
|
nm_ip4_config_set_mss (dst, 0);
|
|
|
|
|
|
2014-04-17 11:15:36 +02:00
|
|
|
/* MTU */
|
2017-01-15 12:57:50 +01:00
|
|
|
if ( nm_ip4_config_get_mtu (src) == nm_ip4_config_get_mtu (dst)
|
|
|
|
|
&& nm_ip4_config_get_mtu_source (src) == nm_ip4_config_get_mtu_source (dst))
|
2014-10-09 18:51:11 +02:00
|
|
|
nm_ip4_config_set_mtu (dst, 0, NM_IP_CONFIG_SOURCE_UNKNOWN);
|
2014-04-17 11:15:36 +02:00
|
|
|
|
2013-08-01 14:04:35 -05:00
|
|
|
/* NIS */
|
|
|
|
|
for (i = 0; i < nm_ip4_config_get_num_nis_servers (src); i++) {
|
2014-11-20 23:36:50 +01:00
|
|
|
idx = _nis_servers_get_index (dst, nm_ip4_config_get_nis_server (src, i));
|
|
|
|
|
if (idx >= 0)
|
|
|
|
|
nm_ip4_config_del_nis_server (dst, idx);
|
2013-08-01 14:04:35 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (g_strcmp0 (nm_ip4_config_get_nis_domain (src), nm_ip4_config_get_nis_domain (dst)) == 0)
|
|
|
|
|
nm_ip4_config_set_nis_domain (dst, NULL);
|
|
|
|
|
|
|
|
|
|
/* WINS */
|
|
|
|
|
for (i = 0; i < nm_ip4_config_get_num_wins (src); i++) {
|
2014-11-20 23:36:50 +01:00
|
|
|
idx = _wins_get_index (dst, nm_ip4_config_get_wins (src, i));
|
|
|
|
|
if (idx >= 0)
|
|
|
|
|
nm_ip4_config_del_wins (dst, idx);
|
2013-08-01 14:04:35 -05:00
|
|
|
}
|
2013-09-06 11:56:41 +02:00
|
|
|
|
2016-04-23 15:57:14 +02:00
|
|
|
/* DNS priority */
|
|
|
|
|
if (nm_ip4_config_get_dns_priority (src) == nm_ip4_config_get_dns_priority (dst))
|
|
|
|
|
nm_ip4_config_set_dns_priority (dst, 0);
|
|
|
|
|
|
2013-09-06 11:56:41 +02:00
|
|
|
g_object_thaw_notify (G_OBJECT (dst));
|
2013-08-01 14:04:35 -05:00
|
|
|
}
|
|
|
|
|
|
2014-11-20 23:39:21 +01:00
|
|
|
void
|
|
|
|
|
nm_ip4_config_intersect (NMIP4Config *dst, const NMIP4Config *src)
|
|
|
|
|
{
|
2017-08-30 11:39:07 +02:00
|
|
|
NMIP4ConfigPrivate *dst_priv;
|
|
|
|
|
const NMIP4ConfigPrivate *src_priv;
|
2017-06-12 18:40:14 +02:00
|
|
|
NMDedupMultiIter ipconf_iter;
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMPlatformIP4Address *a;
|
2017-06-12 18:40:14 +02:00
|
|
|
const NMPlatformIP4Route *r;
|
2017-08-31 13:39:04 +02:00
|
|
|
const NMPObject *new_best_default_route;
|
2017-08-30 11:42:43 +02:00
|
|
|
gboolean changed;
|
2014-11-20 23:39:21 +01:00
|
|
|
|
2017-06-12 18:40:14 +02:00
|
|
|
g_return_if_fail (src);
|
|
|
|
|
g_return_if_fail (dst);
|
2014-11-20 23:39:21 +01:00
|
|
|
|
2017-08-30 11:39:07 +02:00
|
|
|
dst_priv = NM_IP4_CONFIG_GET_PRIVATE (dst);
|
|
|
|
|
src_priv = NM_IP4_CONFIG_GET_PRIVATE (src);
|
2017-06-12 18:40:14 +02:00
|
|
|
|
2017-08-31 13:39:04 +02:00
|
|
|
g_object_freeze_notify (G_OBJECT (dst));
|
|
|
|
|
|
2014-11-20 23:39:21 +01:00
|
|
|
/* addresses */
|
2017-08-30 11:42:43 +02:00
|
|
|
changed = FALSE;
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_iter_ip4_address_for_each (&ipconf_iter, dst, &a) {
|
2017-08-30 11:39:07 +02:00
|
|
|
if (nm_dedup_multi_index_lookup_obj (src_priv->multi_idx,
|
|
|
|
|
&src_priv->idx_ip4_addresses,
|
2017-07-07 23:34:41 +02:00
|
|
|
NMP_OBJECT_UP_CAST (a)))
|
|
|
|
|
continue;
|
|
|
|
|
|
2017-08-30 11:39:07 +02:00
|
|
|
if (nm_dedup_multi_index_remove_entry (dst_priv->multi_idx,
|
2017-07-07 23:34:41 +02:00
|
|
|
ipconf_iter.current) != 1)
|
|
|
|
|
nm_assert_not_reached ();
|
2017-08-30 11:42:43 +02:00
|
|
|
changed = TRUE;
|
2014-11-20 23:39:21 +01:00
|
|
|
}
|
2017-08-30 11:42:43 +02:00
|
|
|
if (changed)
|
|
|
|
|
_notify_addresses (dst);
|
2014-11-20 23:39:21 +01:00
|
|
|
|
2015-06-04 15:57:42 +02:00
|
|
|
/* ignore route_metric */
|
2015-01-26 17:29:25 +01:00
|
|
|
/* ignore nameservers */
|
2014-11-20 23:39:21 +01:00
|
|
|
|
|
|
|
|
/* default gateway */
|
|
|
|
|
if ( !nm_ip4_config_get_num_addresses (dst)
|
2015-07-21 23:07:34 +02:00
|
|
|
|| (nm_ip4_config_has_gateway (src) != nm_ip4_config_has_gateway (dst))
|
|
|
|
|
|| (nm_ip4_config_get_gateway (src) != nm_ip4_config_get_gateway (dst))) {
|
|
|
|
|
nm_ip4_config_unset_gateway (dst);
|
|
|
|
|
}
|
2014-11-20 23:39:21 +01:00
|
|
|
|
|
|
|
|
/* routes */
|
2017-08-30 11:42:43 +02:00
|
|
|
changed = FALSE;
|
2017-08-31 13:39:04 +02:00
|
|
|
new_best_default_route = NULL;
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_iter_ip4_route_for_each (&ipconf_iter, dst, &r) {
|
2017-08-31 13:39:04 +02:00
|
|
|
const NMPObject *o = NMP_OBJECT_UP_CAST (r);
|
|
|
|
|
|
2017-08-30 11:39:07 +02:00
|
|
|
if (nm_dedup_multi_index_lookup_obj (src_priv->multi_idx,
|
|
|
|
|
&src_priv->idx_ip4_routes,
|
2017-08-31 13:39:04 +02:00
|
|
|
o)) {
|
|
|
|
|
new_best_default_route = _nm_ip_config_best_default_route_find_better (new_best_default_route, o);
|
2017-06-12 18:40:14 +02:00
|
|
|
continue;
|
2017-08-31 13:39:04 +02:00
|
|
|
}
|
2017-06-12 18:40:14 +02:00
|
|
|
|
2017-08-30 11:39:07 +02:00
|
|
|
if (nm_dedup_multi_index_remove_entry (dst_priv->multi_idx,
|
2017-06-12 18:40:14 +02:00
|
|
|
ipconf_iter.current) != 1)
|
|
|
|
|
nm_assert_not_reached ();
|
2017-08-30 11:42:43 +02:00
|
|
|
changed = TRUE;
|
2014-11-20 23:39:21 +01:00
|
|
|
}
|
2017-08-31 13:39:04 +02:00
|
|
|
if (_nm_ip_config_best_default_route_set (&dst_priv->best_default_route, new_best_default_route))
|
|
|
|
|
nm_assert (changed);
|
2017-08-30 11:42:43 +02:00
|
|
|
if (changed)
|
|
|
|
|
_notify_routes (dst);
|
2014-11-20 23:39:21 +01:00
|
|
|
|
2015-01-26 17:29:25 +01:00
|
|
|
/* ignore domains */
|
|
|
|
|
/* ignore dns searches */
|
2015-03-26 09:23:12 +01:00
|
|
|
/* ignore dns options */
|
2015-01-26 17:29:25 +01:00
|
|
|
/* ignore NIS */
|
|
|
|
|
/* ignore WINS */
|
2014-11-20 23:39:21 +01:00
|
|
|
|
|
|
|
|
g_object_thaw_notify (G_OBJECT (dst));
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-06 11:02:03 +02:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_ip4_config_replace:
|
2015-11-26 09:08:46 +01:00
|
|
|
* @dst: config to replace with @src content
|
|
|
|
|
* @src: source config to copy
|
2013-09-06 11:02:03 +02:00
|
|
|
* @relevant_changes: return whether there are changes to the
|
|
|
|
|
* destination object that are relevant. This is equal to
|
|
|
|
|
* nm_ip4_config_equal() showing any difference.
|
|
|
|
|
*
|
|
|
|
|
* Replaces everything in @dst with @src so that the two configurations
|
|
|
|
|
* contain the same content -- with the exception of the dbus path.
|
|
|
|
|
*
|
|
|
|
|
* Returns: whether the @dst instance changed in any way (including minor changes,
|
|
|
|
|
* that are not signaled by the output parameter @relevant_changes).
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
2013-09-25 13:08:53 +02:00
|
|
|
nm_ip4_config_replace (NMIP4Config *dst, const NMIP4Config *src, gboolean *relevant_changes)
|
2013-09-06 11:02:03 +02:00
|
|
|
{
|
2015-10-10 20:51:17 +02:00
|
|
|
#if NM_MORE_ASSERTS
|
2013-09-06 11:02:03 +02:00
|
|
|
gboolean config_equal;
|
|
|
|
|
#endif
|
|
|
|
|
gboolean has_minor_changes = FALSE, has_relevant_changes = FALSE, are_equal;
|
|
|
|
|
guint i, num;
|
2016-05-11 18:50:10 +02:00
|
|
|
NMIP4ConfigPrivate *dst_priv;
|
|
|
|
|
const NMIP4ConfigPrivate *src_priv;
|
2017-06-12 18:40:14 +02:00
|
|
|
NMDedupMultiIter ipconf_iter_src, ipconf_iter_dst;
|
2017-07-16 19:18:51 +02:00
|
|
|
const NMDedupMultiHeadEntry *head_entry_src;
|
2017-08-31 13:39:04 +02:00
|
|
|
const NMPObject *new_best_default_route;
|
2013-09-06 11:02:03 +02:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (src != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (dst != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (src != dst, FALSE);
|
|
|
|
|
|
2015-10-10 20:51:17 +02:00
|
|
|
#if NM_MORE_ASSERTS
|
2013-09-06 11:02:03 +02:00
|
|
|
config_equal = nm_ip4_config_equal (dst, src);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
dst_priv = NM_IP4_CONFIG_GET_PRIVATE (dst);
|
|
|
|
|
src_priv = NM_IP4_CONFIG_GET_PRIVATE (src);
|
|
|
|
|
|
2013-09-06 11:56:41 +02:00
|
|
|
g_object_freeze_notify (G_OBJECT (dst));
|
|
|
|
|
|
2015-01-19 18:33:10 +01:00
|
|
|
/* ifindex */
|
|
|
|
|
if (src_priv->ifindex != dst_priv->ifindex) {
|
2015-02-20 16:31:10 -06:00
|
|
|
dst_priv->ifindex = src_priv->ifindex;
|
2015-01-19 18:33:10 +01:00
|
|
|
has_minor_changes = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-06 11:02:03 +02:00
|
|
|
/* never_default */
|
|
|
|
|
if (src_priv->never_default != dst_priv->never_default) {
|
|
|
|
|
dst_priv->never_default = src_priv->never_default;
|
2013-10-24 15:15:02 -04:00
|
|
|
has_minor_changes = TRUE;
|
2013-09-06 11:02:03 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* default gateway */
|
2015-07-21 23:07:34 +02:00
|
|
|
if ( src_priv->gateway != dst_priv->gateway
|
|
|
|
|
|| src_priv->has_gateway != dst_priv->has_gateway) {
|
2015-11-26 09:08:46 +01:00
|
|
|
if (src_priv->has_gateway)
|
|
|
|
|
nm_ip4_config_set_gateway (dst, src_priv->gateway);
|
|
|
|
|
else
|
|
|
|
|
nm_ip4_config_unset_gateway (dst);
|
2013-09-06 11:02:03 +02:00
|
|
|
has_relevant_changes = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-04 15:57:42 +02:00
|
|
|
if (src_priv->route_metric != dst_priv->route_metric) {
|
|
|
|
|
dst_priv->route_metric = src_priv->route_metric;
|
|
|
|
|
has_minor_changes = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-06 11:02:03 +02:00
|
|
|
/* addresses */
|
2017-07-16 19:18:51 +02:00
|
|
|
head_entry_src = nm_ip4_config_lookup_addresses (src);
|
|
|
|
|
nm_dedup_multi_iter_init (&ipconf_iter_src, head_entry_src);
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_iter_ip4_address_init (&ipconf_iter_dst, dst);
|
|
|
|
|
are_equal = TRUE;
|
|
|
|
|
while (TRUE) {
|
|
|
|
|
gboolean has;
|
|
|
|
|
const NMPlatformIP4Address *r_src = NULL;
|
|
|
|
|
const NMPlatformIP4Address *r_dst = NULL;
|
|
|
|
|
|
|
|
|
|
has = nm_ip_config_iter_ip4_address_next (&ipconf_iter_src, &r_src);
|
|
|
|
|
if (has != nm_ip_config_iter_ip4_address_next (&ipconf_iter_dst, &r_dst)) {
|
|
|
|
|
are_equal = FALSE;
|
|
|
|
|
has_relevant_changes = TRUE;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (!has)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
if (nm_platform_ip4_address_cmp (r_src, r_dst) != 0) {
|
|
|
|
|
are_equal = FALSE;
|
2017-09-11 21:41:57 +02:00
|
|
|
if ( r_src->address != r_dst->address
|
|
|
|
|
|| r_src->plen != r_dst->plen
|
2017-07-07 23:34:41 +02:00
|
|
|
|| r_src->peer_address != r_dst->peer_address) {
|
|
|
|
|
has_relevant_changes = TRUE;
|
|
|
|
|
break;
|
2013-09-06 11:02:03 +02:00
|
|
|
}
|
|
|
|
|
}
|
2017-07-07 23:34:41 +02:00
|
|
|
}
|
2013-09-06 11:02:03 +02:00
|
|
|
if (!are_equal) {
|
|
|
|
|
has_minor_changes = TRUE;
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_dedup_multi_index_dirty_set_idx (dst_priv->multi_idx, &dst_priv->idx_ip4_addresses);
|
2017-07-16 19:18:51 +02:00
|
|
|
nm_dedup_multi_iter_for_each (&ipconf_iter_src, head_entry_src) {
|
2017-08-30 14:05:16 +02:00
|
|
|
_nm_ip_config_add_obj (dst_priv->multi_idx,
|
|
|
|
|
&dst_priv->idx_ip4_addresses_,
|
|
|
|
|
dst_priv->ifindex,
|
|
|
|
|
ipconf_iter_src.current->obj,
|
|
|
|
|
NULL,
|
|
|
|
|
FALSE,
|
2017-08-30 19:05:38 +02:00
|
|
|
TRUE,
|
2017-09-05 10:36:50 +02:00
|
|
|
NULL,
|
2017-08-30 19:05:38 +02:00
|
|
|
NULL);
|
2017-07-07 23:34:41 +02:00
|
|
|
}
|
|
|
|
|
nm_dedup_multi_index_dirty_remove_idx (dst_priv->multi_idx, &dst_priv->idx_ip4_addresses, FALSE);
|
2017-07-25 14:23:10 +02:00
|
|
|
_notify_addresses (dst);
|
2013-09-06 11:02:03 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* routes */
|
2017-07-16 19:18:51 +02:00
|
|
|
head_entry_src = nm_ip4_config_lookup_routes (src);
|
|
|
|
|
nm_dedup_multi_iter_init (&ipconf_iter_src, head_entry_src);
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_iter_ip4_route_init (&ipconf_iter_dst, dst);
|
2017-06-12 18:40:14 +02:00
|
|
|
are_equal = TRUE;
|
|
|
|
|
while (TRUE) {
|
|
|
|
|
gboolean has;
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMPlatformIP4Route *r_src = NULL;
|
|
|
|
|
const NMPlatformIP4Route *r_dst = NULL;
|
2017-06-12 18:40:14 +02:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
has = nm_ip_config_iter_ip4_route_next (&ipconf_iter_src, &r_src);
|
|
|
|
|
if (has != nm_ip_config_iter_ip4_route_next (&ipconf_iter_dst, &r_dst)) {
|
2017-06-12 18:40:14 +02:00
|
|
|
are_equal = FALSE;
|
|
|
|
|
has_relevant_changes = TRUE;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (!has)
|
|
|
|
|
break;
|
|
|
|
|
|
2017-07-26 10:50:23 +02:00
|
|
|
if (nm_platform_ip4_route_cmp_full (r_src, r_dst) != 0) {
|
2017-06-12 18:40:14 +02:00
|
|
|
are_equal = FALSE;
|
2017-09-11 21:41:57 +02:00
|
|
|
if ( r_src->plen != r_dst->plen
|
|
|
|
|
|| !nm_utils_ip4_address_same_prefix (r_src->network, r_dst->network, r_src->plen)
|
2017-07-15 11:47:48 +02:00
|
|
|
|| r_src->gateway != r_dst->gateway
|
|
|
|
|
|| r_src->metric != r_dst->metric) {
|
2017-06-12 18:40:14 +02:00
|
|
|
has_relevant_changes = TRUE;
|
|
|
|
|
break;
|
2013-09-06 11:02:03 +02:00
|
|
|
}
|
|
|
|
|
}
|
2017-06-12 18:40:14 +02:00
|
|
|
}
|
2013-09-06 11:02:03 +02:00
|
|
|
if (!are_equal) {
|
|
|
|
|
has_minor_changes = TRUE;
|
2017-08-31 13:39:04 +02:00
|
|
|
new_best_default_route = NULL;
|
2017-06-12 18:40:14 +02:00
|
|
|
nm_dedup_multi_index_dirty_set_idx (dst_priv->multi_idx, &dst_priv->idx_ip4_routes);
|
2017-07-16 19:18:51 +02:00
|
|
|
nm_dedup_multi_iter_for_each (&ipconf_iter_src, head_entry_src) {
|
2017-08-31 13:39:04 +02:00
|
|
|
const NMPObject *o = ipconf_iter_src.current->obj;
|
|
|
|
|
const NMPObject *obj_new;
|
|
|
|
|
|
2017-08-31 13:01:19 +02:00
|
|
|
_nm_ip_config_add_obj (dst_priv->multi_idx,
|
|
|
|
|
&dst_priv->idx_ip4_routes_,
|
|
|
|
|
dst_priv->ifindex,
|
2017-08-31 13:39:04 +02:00
|
|
|
o,
|
2017-08-31 13:01:19 +02:00
|
|
|
NULL,
|
|
|
|
|
FALSE,
|
2017-08-30 19:05:38 +02:00
|
|
|
TRUE,
|
2017-09-05 10:36:50 +02:00
|
|
|
NULL,
|
2017-08-31 13:39:04 +02:00
|
|
|
&obj_new);
|
|
|
|
|
new_best_default_route = _nm_ip_config_best_default_route_find_better (new_best_default_route, obj_new);
|
2017-06-12 18:40:14 +02:00
|
|
|
}
|
|
|
|
|
nm_dedup_multi_index_dirty_remove_idx (dst_priv->multi_idx, &dst_priv->idx_ip4_routes, FALSE);
|
2017-08-31 13:39:04 +02:00
|
|
|
_nm_ip_config_best_default_route_set (&dst_priv->best_default_route, new_best_default_route);
|
2017-07-25 14:23:10 +02:00
|
|
|
_notify_routes (dst);
|
2013-09-06 11:02:03 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* nameservers */
|
|
|
|
|
num = nm_ip4_config_get_num_nameservers (src);
|
|
|
|
|
are_equal = num == nm_ip4_config_get_num_nameservers (dst);
|
|
|
|
|
if (are_equal) {
|
|
|
|
|
for (i = 0; i < num; i++ ) {
|
|
|
|
|
if (nm_ip4_config_get_nameserver (src, i) != nm_ip4_config_get_nameserver (dst, i)) {
|
|
|
|
|
are_equal = FALSE;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!are_equal) {
|
|
|
|
|
nm_ip4_config_reset_nameservers (dst);
|
|
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
|
nm_ip4_config_add_nameserver (dst, nm_ip4_config_get_nameserver (src, i));
|
|
|
|
|
has_relevant_changes = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* domains */
|
|
|
|
|
num = nm_ip4_config_get_num_domains (src);
|
|
|
|
|
are_equal = num == nm_ip4_config_get_num_domains (dst);
|
|
|
|
|
if (are_equal) {
|
|
|
|
|
for (i = 0; i < num; i++ ) {
|
|
|
|
|
if (g_strcmp0 (nm_ip4_config_get_domain (src, i),
|
|
|
|
|
nm_ip4_config_get_domain (dst, i))) {
|
|
|
|
|
are_equal = FALSE;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!are_equal) {
|
|
|
|
|
nm_ip4_config_reset_domains (dst);
|
|
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
|
nm_ip4_config_add_domain (dst, nm_ip4_config_get_domain (src, i));
|
|
|
|
|
has_relevant_changes = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* dns searches */
|
|
|
|
|
num = nm_ip4_config_get_num_searches (src);
|
|
|
|
|
are_equal = num == nm_ip4_config_get_num_searches (dst);
|
|
|
|
|
if (are_equal) {
|
|
|
|
|
for (i = 0; i < num; i++ ) {
|
|
|
|
|
if (g_strcmp0 (nm_ip4_config_get_search (src, i),
|
|
|
|
|
nm_ip4_config_get_search (dst, i))) {
|
|
|
|
|
are_equal = FALSE;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!are_equal) {
|
|
|
|
|
nm_ip4_config_reset_searches (dst);
|
|
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
|
nm_ip4_config_add_search (dst, nm_ip4_config_get_search (src, i));
|
|
|
|
|
has_relevant_changes = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-26 09:23:12 +01:00
|
|
|
/* dns options */
|
|
|
|
|
num = nm_ip4_config_get_num_dns_options (src);
|
|
|
|
|
are_equal = num == nm_ip4_config_get_num_dns_options (dst);
|
|
|
|
|
if (are_equal) {
|
|
|
|
|
for (i = 0; i < num; i++ ) {
|
|
|
|
|
if (g_strcmp0 (nm_ip4_config_get_dns_option (src, i),
|
|
|
|
|
nm_ip4_config_get_dns_option (dst, i))) {
|
|
|
|
|
are_equal = FALSE;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!are_equal) {
|
|
|
|
|
nm_ip4_config_reset_dns_options (dst);
|
|
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
|
nm_ip4_config_add_dns_option (dst, nm_ip4_config_get_dns_option (src, i));
|
|
|
|
|
has_relevant_changes = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2016-04-23 15:57:14 +02:00
|
|
|
/* DNS priority */
|
|
|
|
|
if (src_priv->dns_priority != dst_priv->dns_priority) {
|
|
|
|
|
nm_ip4_config_set_dns_priority (dst, src_priv->dns_priority);
|
2016-05-30 14:37:22 +02:00
|
|
|
has_minor_changes = TRUE;
|
2016-04-23 15:57:14 +02:00
|
|
|
}
|
|
|
|
|
|
2013-09-06 11:02:03 +02:00
|
|
|
/* mss */
|
|
|
|
|
if (src_priv->mss != dst_priv->mss) {
|
|
|
|
|
nm_ip4_config_set_mss (dst, src_priv->mss);
|
|
|
|
|
has_minor_changes = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* nis */
|
|
|
|
|
num = nm_ip4_config_get_num_nis_servers (src);
|
|
|
|
|
are_equal = num == nm_ip4_config_get_num_nis_servers (dst);
|
|
|
|
|
if (are_equal) {
|
|
|
|
|
for (i = 0; i < num; i++ ) {
|
|
|
|
|
if (nm_ip4_config_get_nis_server (src, i) != nm_ip4_config_get_nis_server (dst, i)) {
|
|
|
|
|
are_equal = FALSE;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!are_equal) {
|
|
|
|
|
nm_ip4_config_reset_nis_servers (dst);
|
|
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
|
nm_ip4_config_add_nis_server (dst, nm_ip4_config_get_nis_server (src, i));
|
|
|
|
|
has_relevant_changes = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* nis_domain */
|
|
|
|
|
if (g_strcmp0 (src_priv->nis_domain, dst_priv->nis_domain)) {
|
|
|
|
|
nm_ip4_config_set_nis_domain (dst, src_priv->nis_domain);
|
|
|
|
|
has_relevant_changes = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* wins */
|
|
|
|
|
num = nm_ip4_config_get_num_wins (src);
|
|
|
|
|
are_equal = num == nm_ip4_config_get_num_wins (dst);
|
|
|
|
|
if (are_equal) {
|
|
|
|
|
for (i = 0; i < num; i++ ) {
|
|
|
|
|
if (nm_ip4_config_get_wins (src, i) != nm_ip4_config_get_wins (dst, i)) {
|
|
|
|
|
are_equal = FALSE;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!are_equal) {
|
|
|
|
|
nm_ip4_config_reset_wins (dst);
|
|
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
|
nm_ip4_config_add_wins (dst, nm_ip4_config_get_wins (src, i));
|
|
|
|
|
has_relevant_changes = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mtu */
|
2017-01-15 12:57:50 +01:00
|
|
|
if ( src_priv->mtu != dst_priv->mtu
|
|
|
|
|
|| src_priv->mtu_source != dst_priv->mtu_source) {
|
2014-10-09 18:51:11 +02:00
|
|
|
nm_ip4_config_set_mtu (dst, src_priv->mtu, src_priv->mtu_source);
|
2013-09-06 11:02:03 +02:00
|
|
|
has_minor_changes = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-30 18:11:16 +02:00
|
|
|
/* metered */
|
|
|
|
|
if (src_priv->metered != dst_priv->metered) {
|
|
|
|
|
dst_priv->metered = src_priv->metered;
|
|
|
|
|
has_minor_changes = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-10 20:51:17 +02:00
|
|
|
#if NM_MORE_ASSERTS
|
2013-09-06 11:02:03 +02:00
|
|
|
/* config_equal does not compare *all* the fields, therefore, we might have has_minor_changes
|
|
|
|
|
* regardless of config_equal. But config_equal must correspond to has_relevant_changes. */
|
2015-10-10 20:51:17 +02:00
|
|
|
nm_assert (config_equal == !has_relevant_changes);
|
|
|
|
|
#endif
|
2013-09-06 11:02:03 +02:00
|
|
|
|
2013-09-06 11:56:41 +02:00
|
|
|
g_object_thaw_notify (G_OBJECT (dst));
|
|
|
|
|
|
2013-09-06 11:02:03 +02:00
|
|
|
if (relevant_changes)
|
|
|
|
|
*relevant_changes = has_relevant_changes;
|
|
|
|
|
|
|
|
|
|
return has_relevant_changes || has_minor_changes;
|
|
|
|
|
}
|
|
|
|
|
|
2013-08-01 16:10:15 -05:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_dump (const NMIP4Config *self, const char *detail)
|
2013-08-01 16:10:15 -05:00
|
|
|
{
|
2017-06-12 18:40:14 +02:00
|
|
|
guint32 tmp;
|
|
|
|
|
guint i;
|
2013-11-07 18:07:21 +01:00
|
|
|
const char *str;
|
2017-06-12 18:40:14 +02:00
|
|
|
NMDedupMultiIter ipconf_iter;
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMPlatformIP4Address *address;
|
2017-06-12 18:40:14 +02:00
|
|
|
const NMPlatformIP4Route *route;
|
2013-08-01 16:10:15 -05:00
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
g_message ("--------- NMIP4Config %p (%s)", self, detail);
|
2013-08-01 16:10:15 -05:00
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
if (self == NULL) {
|
2016-01-12 17:58:18 +01:00
|
|
|
g_message (" (null)");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
str = nm_exported_object_get_path (NM_EXPORTED_OBJECT (self));
|
2013-11-07 18:07:21 +01:00
|
|
|
if (str)
|
|
|
|
|
g_message (" path: %s", str);
|
2013-08-01 16:10:15 -05:00
|
|
|
|
2013-11-07 18:07:21 +01:00
|
|
|
/* addresses */
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_iter_ip4_address_for_each (&ipconf_iter, self, &address)
|
|
|
|
|
g_message (" a: %s", nm_platform_ip4_address_to_string (address, NULL, 0));
|
2013-08-01 16:10:15 -05:00
|
|
|
|
|
|
|
|
/* default gateway */
|
2017-07-10 14:03:44 +02:00
|
|
|
if (nm_ip4_config_has_gateway (self)) {
|
|
|
|
|
tmp = nm_ip4_config_get_gateway (self);
|
2015-07-21 23:07:34 +02:00
|
|
|
g_message (" gw: %s", nm_utils_inet4_ntop (tmp, NULL));
|
|
|
|
|
}
|
2013-08-01 16:10:15 -05:00
|
|
|
|
|
|
|
|
/* nameservers */
|
2017-07-10 14:03:44 +02:00
|
|
|
for (i = 0; i < nm_ip4_config_get_num_nameservers (self); i++) {
|
|
|
|
|
tmp = nm_ip4_config_get_nameserver (self, i);
|
2013-10-30 22:11:21 +01:00
|
|
|
g_message (" ns: %s", nm_utils_inet4_ntop (tmp, NULL));
|
2013-08-01 16:10:15 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* routes */
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_iter_ip4_route_for_each (&ipconf_iter, self, &route)
|
2017-06-12 18:40:14 +02:00
|
|
|
g_message (" rt: %s", nm_platform_ip4_route_to_string (route, NULL, 0));
|
2013-08-01 16:10:15 -05:00
|
|
|
|
|
|
|
|
/* domains */
|
2017-07-10 14:03:44 +02:00
|
|
|
for (i = 0; i < nm_ip4_config_get_num_domains (self); i++)
|
|
|
|
|
g_message (" domain: %s", nm_ip4_config_get_domain (self, i));
|
2013-08-01 16:10:15 -05:00
|
|
|
|
|
|
|
|
/* dns searches */
|
2017-07-10 14:03:44 +02:00
|
|
|
for (i = 0; i < nm_ip4_config_get_num_searches (self); i++)
|
|
|
|
|
g_message (" search: %s", nm_ip4_config_get_search (self, i));
|
2013-08-01 16:10:15 -05:00
|
|
|
|
2015-03-26 09:23:12 +01:00
|
|
|
/* dns options */
|
2017-07-10 14:03:44 +02:00
|
|
|
for (i = 0; i < nm_ip4_config_get_num_dns_options (self); i++)
|
|
|
|
|
g_message (" dnsopt: %s", nm_ip4_config_get_dns_option (self, i));
|
2015-03-26 09:23:12 +01:00
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
g_message (" dnspri: %d", nm_ip4_config_get_dns_priority (self));
|
2015-03-26 09:23:12 +01:00
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
g_message (" mss: %"G_GUINT32_FORMAT, nm_ip4_config_get_mss (self));
|
|
|
|
|
g_message (" mtu: %"G_GUINT32_FORMAT" (source: %d)", nm_ip4_config_get_mtu (self), (int) nm_ip4_config_get_mtu_source (self));
|
2013-08-01 16:10:15 -05:00
|
|
|
|
|
|
|
|
/* NIS */
|
2017-07-10 14:03:44 +02:00
|
|
|
for (i = 0; i < nm_ip4_config_get_num_nis_servers (self); i++) {
|
|
|
|
|
tmp = nm_ip4_config_get_nis_server (self, i);
|
2013-10-30 22:11:21 +01:00
|
|
|
g_message (" nis: %s", nm_utils_inet4_ntop (tmp, NULL));
|
2013-08-01 16:10:15 -05:00
|
|
|
}
|
|
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
g_message (" nisdmn: %s", nm_ip4_config_get_nis_domain (self) ?: "(none)");
|
2013-08-01 16:10:15 -05:00
|
|
|
|
|
|
|
|
/* WINS */
|
2017-07-10 14:03:44 +02:00
|
|
|
for (i = 0; i < nm_ip4_config_get_num_wins (self); i++) {
|
|
|
|
|
tmp = nm_ip4_config_get_wins (self, i);
|
2013-10-30 22:11:21 +01:00
|
|
|
g_message (" wins: %s", nm_utils_inet4_ntop (tmp, NULL));
|
2013-08-01 16:10:15 -05:00
|
|
|
}
|
2013-11-07 18:07:21 +01:00
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
g_message (" n-dflt: %d", nm_ip4_config_get_never_default (self));
|
|
|
|
|
g_message (" mtrd: %d", (int) nm_ip4_config_get_metered (self));
|
2013-08-01 16:10:15 -05:00
|
|
|
}
|
|
|
|
|
|
2013-07-03 10:26:19 +02:00
|
|
|
gboolean
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_destination_is_direct (const NMIP4Config *self, guint32 network, guint8 plen)
|
2008-09-05 02:55:40 +00:00
|
|
|
{
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMPlatformIP4Address *item;
|
2015-10-22 15:15:47 +02:00
|
|
|
in_addr_t peer_network;
|
2017-07-07 23:34:41 +02:00
|
|
|
NMDedupMultiIter iter;
|
2008-09-05 02:55:40 +00:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_iter_ip4_address_for_each (&iter, self, &item) {
|
2015-10-22 15:15:47 +02:00
|
|
|
if (item->plen > plen)
|
|
|
|
|
continue;
|
|
|
|
|
|
2015-10-21 23:17:11 +02:00
|
|
|
peer_network = nm_utils_ip4_address_clear_host_address (item->peer_address, item->plen);
|
2015-10-22 15:15:47 +02:00
|
|
|
if (_ipv4_is_zeronet (peer_network))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (peer_network != nm_utils_ip4_address_clear_host_address (network, item->plen))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
2013-07-03 10:26:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return FALSE;
|
2005-04-15 15:43:42 +00:00
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-07-03 10:26:19 +02:00
|
|
|
|
2008-05-06 Dan Williams <dcbw@redhat.com>
* src/dhcp-manager/nm-dhcp-manager.c
- (nm_dhcp_manager_get_ip4_config): clean up; update for changes to
NMIP4Config to support multiple IP addresses
* src/NetworkManagerUtils.c
- (nm_utils_merge_ip4_config): update for multiple IP addresses
* src/nm-ip4-config.c
src/nm-ip4-config.h
- Store a list of IPv4 address/netmask/gateway tuples
- (nm_ip4_config_get_gateway, nm_ip4_config_set_gateway,
nm_ip4_config_get_netmask, nm_ip4_config_set_netmask,
nm_ip4_config_get_broadcast, nm_ip4_config_set_broadcast,
nm_ip4_config_set_address): remove
- (nm_ip4_config_take_address, nm_ip4_config_add_address,
nm_ip4_config_replace_address, nm_ip4_config_get_num_addresses):
new functions; handle multiple IPv4 addresses
* src/nm-device.c
src/ppp-manager/nm-ppp-manager.c
src/vpn-manager/nm-vpn-connection.c
src/NetworkManagerPolicy.c
test/nm-tool.c
libnm-glib/libnm-glib-test.c
- update for changes to NMIP4Config for multiple IPv4 addresses
* src/NetworkManagerSystem.c
- (nm_system_device_set_ip4_route): don't add the route if any address
is on the same subnet as the destination
- (check_one_address): ignore the exact match, just match family and
interface index
- (add_ip4_addresses): add all IPv4 addresses in an NMIP4Config to
an interface
- (nm_system_device_set_from_ip4_config): use add_ip4_addresses()
- (nm_system_vpn_device_set_from_ip4_config): use add_ip4_addresses()
* introspection/nm-ip4-config.xml
- Remove 'address', 'gateway', 'netmask', and 'broadcast' properties
- Add 'addresses' property which is an array of (uuu) tuples of
address/netmask/gateway
* libnm-util/nm-setting-ip4-config.c
- (set_property): use ip-address <-> GValue converters from nm-utils.c
* libnm-glib/nm-ip4-config.c
libnm-glib/nm-ip4-config.h
- Handle D-Bus interface changes to support multiple IP addresses
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3637 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-05-06 21:53:22 +00:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_set_never_default (NMIP4Config *self, gboolean never_default)
|
2005-04-15 15:43:42 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2005-04-15 15:43:42 +00:00
|
|
|
|
2017-01-15 12:33:10 +01:00
|
|
|
priv->never_default = never_default;
|
2005-04-15 15:43:42 +00:00
|
|
|
}
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
gboolean
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_never_default (const NMIP4Config *self)
|
2006-01-16 22:58:13 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2012-05-14 10:35:39 -04:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
return priv->never_default;
|
2006-01-16 22:58:13 +00:00
|
|
|
}
|
|
|
|
|
|
2008-05-06 Dan Williams <dcbw@redhat.com>
* src/dhcp-manager/nm-dhcp-manager.c
- (nm_dhcp_manager_get_ip4_config): clean up; update for changes to
NMIP4Config to support multiple IP addresses
* src/NetworkManagerUtils.c
- (nm_utils_merge_ip4_config): update for multiple IP addresses
* src/nm-ip4-config.c
src/nm-ip4-config.h
- Store a list of IPv4 address/netmask/gateway tuples
- (nm_ip4_config_get_gateway, nm_ip4_config_set_gateway,
nm_ip4_config_get_netmask, nm_ip4_config_set_netmask,
nm_ip4_config_get_broadcast, nm_ip4_config_set_broadcast,
nm_ip4_config_set_address): remove
- (nm_ip4_config_take_address, nm_ip4_config_add_address,
nm_ip4_config_replace_address, nm_ip4_config_get_num_addresses):
new functions; handle multiple IPv4 addresses
* src/nm-device.c
src/ppp-manager/nm-ppp-manager.c
src/vpn-manager/nm-vpn-connection.c
src/NetworkManagerPolicy.c
test/nm-tool.c
libnm-glib/libnm-glib-test.c
- update for changes to NMIP4Config for multiple IPv4 addresses
* src/NetworkManagerSystem.c
- (nm_system_device_set_ip4_route): don't add the route if any address
is on the same subnet as the destination
- (check_one_address): ignore the exact match, just match family and
interface index
- (add_ip4_addresses): add all IPv4 addresses in an NMIP4Config to
an interface
- (nm_system_device_set_from_ip4_config): use add_ip4_addresses()
- (nm_system_vpn_device_set_from_ip4_config): use add_ip4_addresses()
* introspection/nm-ip4-config.xml
- Remove 'address', 'gateway', 'netmask', and 'broadcast' properties
- Add 'addresses' property which is an array of (uuu) tuples of
address/netmask/gateway
* libnm-util/nm-setting-ip4-config.c
- (set_property): use ip-address <-> GValue converters from nm-utils.c
* libnm-glib/nm-ip4-config.c
libnm-glib/nm-ip4-config.h
- Handle D-Bus interface changes to support multiple IP addresses
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3637 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-05-06 21:53:22 +00:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_set_gateway (NMIP4Config *self, guint32 gateway)
|
2005-04-15 15:43:42 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2005-04-15 15:43:42 +00:00
|
|
|
|
2015-07-21 23:07:34 +02:00
|
|
|
if (priv->gateway != gateway || !priv->has_gateway) {
|
2013-09-06 11:56:41 +02:00
|
|
|
priv->gateway = gateway;
|
2015-07-21 23:07:34 +02:00
|
|
|
priv->has_gateway = TRUE;
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_GATEWAY);
|
2015-07-21 23:07:34 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_unset_gateway (NMIP4Config *self)
|
2015-07-21 23:07:34 +02:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2015-07-21 23:07:34 +02:00
|
|
|
|
|
|
|
|
if (priv->has_gateway) {
|
|
|
|
|
priv->gateway = 0;
|
|
|
|
|
priv->has_gateway = FALSE;
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_GATEWAY);
|
2013-09-06 11:56:41 +02:00
|
|
|
}
|
2013-07-12 11:33:52 +02:00
|
|
|
}
|
2005-04-15 15:43:42 +00:00
|
|
|
|
2016-01-18 12:31:52 +01:00
|
|
|
/**
|
|
|
|
|
* nm_ip4_config_has_gateway:
|
2017-07-10 14:03:44 +02:00
|
|
|
* @self: the #NMIP4Config object
|
2016-01-18 12:31:52 +01:00
|
|
|
*
|
|
|
|
|
* NetworkManager's handling of default-routes is limited and usually a default-route
|
|
|
|
|
* cannot have gateway 0.0.0.0. For peer-to-peer routes, we still want to
|
|
|
|
|
* support that, so we need to differenciate between no-default-route and a
|
|
|
|
|
* on-link-default route. Hence nm_ip4_config_has_gateway().
|
|
|
|
|
*
|
|
|
|
|
* Returns: whether the object has a gateway explicitly set. */
|
2015-07-21 23:07:34 +02:00
|
|
|
gboolean
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_has_gateway (const NMIP4Config *self)
|
2015-07-21 23:07:34 +02:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2015-07-21 23:07:34 +02:00
|
|
|
|
|
|
|
|
return priv->has_gateway;
|
|
|
|
|
}
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
guint32
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_gateway (const NMIP4Config *self)
|
2013-07-12 11:33:52 +02:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2008-08-10 22:37:21 +00:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
return priv->gateway;
|
2005-04-15 15:43:42 +00:00
|
|
|
}
|
|
|
|
|
|
2015-06-04 15:57:42 +02:00
|
|
|
gint64
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_route_metric (const NMIP4Config *self)
|
2015-06-04 15:57:42 +02:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2015-06-04 15:57:42 +02:00
|
|
|
|
|
|
|
|
return priv->route_metric;
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-07-12 11:33:52 +02:00
|
|
|
|
|
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_reset_addresses (NMIP4Config *self)
|
2005-04-15 15:43:42 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2005-04-15 15:43:42 +00:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
if (nm_dedup_multi_index_remove_idx (priv->multi_idx,
|
|
|
|
|
&priv->idx_ip4_addresses) > 0)
|
|
|
|
|
_notify_addresses (self);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
_add_address (NMIP4Config *self, const NMPObject *obj_new, const NMPlatformIP4Address *new)
|
|
|
|
|
{
|
|
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
|
|
|
|
|
|
|
|
|
if (_nm_ip_config_add_obj (priv->multi_idx,
|
|
|
|
|
&priv->idx_ip4_addresses_,
|
|
|
|
|
priv->ifindex,
|
|
|
|
|
obj_new,
|
2017-08-16 14:38:39 +02:00
|
|
|
(const NMPlatformObject *) new,
|
|
|
|
|
TRUE,
|
2017-08-30 19:05:38 +02:00
|
|
|
FALSE,
|
2017-09-05 10:36:50 +02:00
|
|
|
NULL,
|
2017-08-30 19:05:38 +02:00
|
|
|
NULL))
|
2017-07-07 23:34:41 +02:00
|
|
|
_notify_addresses (self);
|
2005-04-15 15:43:42 +00:00
|
|
|
}
|
|
|
|
|
|
2014-01-06 14:14:14 -06:00
|
|
|
/**
|
|
|
|
|
* nm_ip4_config_add_address:
|
2017-07-10 14:03:44 +02:00
|
|
|
* @self: the #NMIP4Config
|
|
|
|
|
* @new: the new address to add to @self
|
2014-01-06 14:14:14 -06:00
|
|
|
*
|
2017-07-10 14:03:44 +02:00
|
|
|
* Adds the new address to @self. If an address with the same basic properties
|
|
|
|
|
* (address, prefix) already exists in @self, it is overwritten with the
|
2014-01-06 14:14:14 -06:00
|
|
|
* lifetime and preferred of @new. The source is also overwritten by the source
|
|
|
|
|
* from @new if that source is higher priority.
|
|
|
|
|
*/
|
2013-07-12 11:33:52 +02:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_add_address (NMIP4Config *self, const NMPlatformIP4Address *new)
|
2013-06-11 17:05:49 -05:00
|
|
|
{
|
2017-07-07 23:34:41 +02:00
|
|
|
g_return_if_fail (self);
|
|
|
|
|
g_return_if_fail (new);
|
|
|
|
|
g_return_if_fail (new->plen > 0 && new->plen <= 32);
|
|
|
|
|
g_return_if_fail (NM_IP4_CONFIG_GET_PRIVATE (self)->ifindex > 0);
|
2013-06-11 17:05:49 -05:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
_add_address (self, NULL, new);
|
2005-04-15 15:43:42 +00:00
|
|
|
}
|
|
|
|
|
|
2013-08-01 14:04:35 -05:00
|
|
|
void
|
2017-09-05 10:31:56 +02:00
|
|
|
_nmtst_ip4_config_del_address (NMIP4Config *self, guint i)
|
2013-08-01 14:04:35 -05:00
|
|
|
{
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMPlatformIP4Address *a;
|
2013-08-01 14:04:35 -05:00
|
|
|
|
2017-09-05 10:31:56 +02:00
|
|
|
a = _nmtst_ip4_config_get_address (self, i);
|
2017-08-31 13:39:04 +02:00
|
|
|
if (!nm_ip4_config_nmpobj_remove (self,
|
|
|
|
|
NMP_OBJECT_UP_CAST (a)))
|
|
|
|
|
g_assert_not_reached ();
|
2013-08-01 14:04:35 -05:00
|
|
|
}
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
guint
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_num_addresses (const NMIP4Config *self)
|
2005-04-15 15:43:42 +00:00
|
|
|
{
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMDedupMultiHeadEntry *head_entry;
|
2005-04-15 15:43:42 +00:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
head_entry = nm_ip4_config_lookup_addresses (self);
|
|
|
|
|
return head_entry ? head_entry->len : 0;
|
2005-04-15 15:43:42 +00:00
|
|
|
}
|
|
|
|
|
|
2013-06-29 13:33:36 +02:00
|
|
|
const NMPlatformIP4Address *
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip4_config_get_first_address (const NMIP4Config *self)
|
2005-04-15 15:43:42 +00:00
|
|
|
{
|
2017-07-07 23:34:41 +02:00
|
|
|
NMDedupMultiIter iter;
|
|
|
|
|
const NMPlatformIP4Address *a = NULL;
|
2008-12-19 17:01:06 -05:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_iter_ip4_address_for_each (&iter, self, &a)
|
|
|
|
|
return a;
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const NMPlatformIP4Address *
|
2017-09-05 10:31:56 +02:00
|
|
|
_nmtst_ip4_config_get_address (const NMIP4Config *self, guint i)
|
2017-07-07 23:34:41 +02:00
|
|
|
{
|
|
|
|
|
NMDedupMultiIter iter;
|
|
|
|
|
const NMPlatformIP4Address *a = NULL;
|
|
|
|
|
guint j;
|
|
|
|
|
|
|
|
|
|
j = 0;
|
|
|
|
|
nm_ip_config_iter_ip4_address_for_each (&iter, self, &a) {
|
|
|
|
|
if (i == j)
|
|
|
|
|
return a;
|
|
|
|
|
j++;
|
|
|
|
|
}
|
|
|
|
|
g_return_val_if_reached (NULL);
|
2005-04-15 15:43:42 +00:00
|
|
|
}
|
|
|
|
|
|
2013-11-02 10:20:03 -05:00
|
|
|
gboolean
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_address_exists (const NMIP4Config *self,
|
2013-11-02 10:20:03 -05:00
|
|
|
const NMPlatformIP4Address *needle)
|
|
|
|
|
{
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
|
|
|
|
NMPObject obj_stack;
|
|
|
|
|
|
|
|
|
|
nmp_object_stackinit_id_ip4_address (&obj_stack,
|
|
|
|
|
priv->ifindex,
|
|
|
|
|
needle->address,
|
|
|
|
|
needle->plen,
|
|
|
|
|
needle->peer_address);
|
|
|
|
|
return !!nm_dedup_multi_index_lookup_obj (priv->multi_idx,
|
2017-08-23 18:34:44 +02:00
|
|
|
&priv->idx_ip4_addresses,
|
2017-07-07 23:34:41 +02:00
|
|
|
&obj_stack);
|
2013-11-02 10:20:03 -05:00
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2005-04-15 15:43:42 +00:00
|
|
|
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
static const NMDedupMultiEntry *
|
|
|
|
|
_lookup_route (const NMIP4Config *self,
|
|
|
|
|
const NMPObject *needle,
|
|
|
|
|
NMPlatformIPRouteCmpType cmp_type)
|
|
|
|
|
{
|
|
|
|
|
const NMIP4ConfigPrivate *priv;
|
|
|
|
|
|
|
|
|
|
nm_assert (NM_IS_IP4_CONFIG (self));
|
|
|
|
|
nm_assert (NMP_OBJECT_GET_TYPE (needle) == NMP_OBJECT_TYPE_IP4_ROUTE);
|
|
|
|
|
|
|
|
|
|
priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
|
|
|
|
|
|
|
|
|
return _nm_ip_config_lookup_ip_route (priv->multi_idx,
|
|
|
|
|
&priv->idx_ip4_routes_,
|
|
|
|
|
needle,
|
|
|
|
|
cmp_type);
|
|
|
|
|
}
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_reset_routes (NMIP4Config *self)
|
2005-04-15 15:43:42 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2005-04-15 15:43:42 +00:00
|
|
|
|
2017-06-12 18:40:14 +02:00
|
|
|
if (nm_dedup_multi_index_remove_idx (priv->multi_idx,
|
2017-08-31 13:39:04 +02:00
|
|
|
&priv->idx_ip4_routes) > 0) {
|
|
|
|
|
nm_clear_nmp_object (&priv->best_default_route);
|
2017-07-07 23:34:41 +02:00
|
|
|
_notify_routes (self);
|
2017-08-31 13:39:04 +02:00
|
|
|
}
|
2005-04-15 15:43:42 +00:00
|
|
|
}
|
|
|
|
|
|
2017-06-12 18:40:14 +02:00
|
|
|
static void
|
2017-09-05 10:36:50 +02:00
|
|
|
_add_route (NMIP4Config *self,
|
|
|
|
|
const NMPObject *obj_new,
|
|
|
|
|
const NMPlatformIP4Route *new,
|
|
|
|
|
const NMPObject **out_obj_new)
|
2017-06-12 18:40:14 +02:00
|
|
|
{
|
2017-07-07 23:34:41 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2017-08-31 13:39:04 +02:00
|
|
|
nm_auto_nmpobj const NMPObject *obj_old = NULL;
|
2017-09-05 10:36:50 +02:00
|
|
|
const NMPObject *obj_new_2;
|
2017-06-12 18:40:14 +02:00
|
|
|
|
2017-07-19 11:30:13 +02:00
|
|
|
nm_assert ((!new) != (!obj_new));
|
|
|
|
|
nm_assert (!new || _route_valid (new));
|
|
|
|
|
nm_assert (!obj_new || _route_valid (NMP_OBJECT_CAST_IP4_ROUTE (obj_new)));
|
|
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
if (_nm_ip_config_add_obj (priv->multi_idx,
|
|
|
|
|
&priv->idx_ip4_routes_,
|
|
|
|
|
priv->ifindex,
|
|
|
|
|
obj_new,
|
2017-08-16 14:38:39 +02:00
|
|
|
(const NMPlatformObject *) new,
|
|
|
|
|
TRUE,
|
2017-08-30 19:05:38 +02:00
|
|
|
FALSE,
|
2017-08-31 13:39:04 +02:00
|
|
|
&obj_old,
|
2017-09-05 10:36:50 +02:00
|
|
|
&obj_new_2)) {
|
2017-08-31 13:39:04 +02:00
|
|
|
if ( priv->best_default_route == obj_old
|
|
|
|
|
&& obj_old != obj_new_2)
|
|
|
|
|
nm_clear_nmp_object (&priv->best_default_route);
|
|
|
|
|
_nm_ip_config_best_default_route_merge (&priv->best_default_route, obj_new_2);
|
2017-09-05 10:36:50 +02:00
|
|
|
NM_SET_OUT (out_obj_new, nmp_object_ref (obj_new_2));
|
2017-07-07 23:34:41 +02:00
|
|
|
_notify_routes (self);
|
2017-09-05 10:36:50 +02:00
|
|
|
} else
|
|
|
|
|
NM_SET_OUT (out_obj_new, nmp_object_ref (obj_new_2));
|
2017-06-12 18:40:14 +02:00
|
|
|
}
|
|
|
|
|
|
2014-01-06 14:14:14 -06:00
|
|
|
/**
|
|
|
|
|
* nm_ip4_config_add_route:
|
2017-07-10 14:03:44 +02:00
|
|
|
* @self: the #NMIP4Config
|
|
|
|
|
* @new: the new route to add to @self
|
2017-09-05 10:36:50 +02:00
|
|
|
* @out_obj_new: (allow-none): (out): the added route object. Must be unrefed
|
|
|
|
|
* by caller.
|
2014-01-06 14:14:14 -06:00
|
|
|
*
|
2017-07-10 14:03:44 +02:00
|
|
|
* Adds the new route to @self. If a route with the same basic properties
|
|
|
|
|
* (network, prefix) already exists in @self, it is overwritten including the
|
2014-01-06 14:14:14 -06:00
|
|
|
* gateway and metric of @new. The source is also overwritten by the source
|
|
|
|
|
* from @new if that source is higher priority.
|
|
|
|
|
*/
|
2013-07-12 11:33:52 +02:00
|
|
|
void
|
2017-09-05 10:36:50 +02:00
|
|
|
nm_ip4_config_add_route (NMIP4Config *self,
|
|
|
|
|
const NMPlatformIP4Route *new,
|
|
|
|
|
const NMPObject **out_obj_new)
|
2008-12-19 17:01:06 -05:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
g_return_if_fail (self);
|
2017-06-12 18:40:14 +02:00
|
|
|
g_return_if_fail (new);
|
2017-08-31 13:39:04 +02:00
|
|
|
g_return_if_fail (new->plen <= 32);
|
2017-07-10 14:03:44 +02:00
|
|
|
g_return_if_fail (NM_IP4_CONFIG_GET_PRIVATE (self)->ifindex > 0);
|
2013-07-15 17:56:46 -05:00
|
|
|
|
2017-09-05 10:36:50 +02:00
|
|
|
_add_route (self, NULL, new, out_obj_new);
|
2008-12-19 17:01:06 -05:00
|
|
|
}
|
|
|
|
|
|
2013-08-01 14:04:35 -05:00
|
|
|
void
|
2017-09-05 10:31:56 +02:00
|
|
|
_nmtst_ip4_config_del_route (NMIP4Config *self, guint i)
|
2013-08-01 14:04:35 -05:00
|
|
|
{
|
2017-06-12 18:40:14 +02:00
|
|
|
const NMPlatformIP4Route *r;
|
2013-07-31 23:07:32 +02:00
|
|
|
|
2017-09-05 10:31:56 +02:00
|
|
|
r = _nmtst_ip4_config_get_route (self, i);
|
2017-08-31 13:39:04 +02:00
|
|
|
if (!nm_ip4_config_nmpobj_remove (self,
|
|
|
|
|
NMP_OBJECT_UP_CAST (r)))
|
|
|
|
|
g_assert_not_reached ();
|
2013-08-01 14:04:35 -05:00
|
|
|
}
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
guint
|
2017-06-12 18:40:14 +02:00
|
|
|
nm_ip4_config_get_num_routes (const NMIP4Config *self)
|
2008-12-19 17:01:06 -05:00
|
|
|
{
|
2017-06-12 18:40:14 +02:00
|
|
|
const NMDedupMultiHeadEntry *head_entry;
|
2008-12-19 17:01:06 -05:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
head_entry = nm_ip4_config_lookup_routes (self);
|
2017-09-12 10:07:39 +02:00
|
|
|
nm_assert (!head_entry || head_entry->len == c_list_length (&head_entry->lst_entries_head));
|
2017-06-12 18:40:14 +02:00
|
|
|
return head_entry ? head_entry->len : 0;
|
2008-12-19 17:01:06 -05:00
|
|
|
}
|
|
|
|
|
|
2013-09-24 18:19:18 +02:00
|
|
|
const NMPlatformIP4Route *
|
2017-09-05 10:31:56 +02:00
|
|
|
_nmtst_ip4_config_get_route (const NMIP4Config *self, guint i)
|
2017-06-12 18:40:14 +02:00
|
|
|
{
|
2017-07-07 23:34:41 +02:00
|
|
|
NMDedupMultiIter iter;
|
|
|
|
|
const NMPlatformIP4Route *r = NULL;
|
2017-06-12 18:40:14 +02:00
|
|
|
guint j;
|
|
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
j = 0;
|
|
|
|
|
nm_ip_config_iter_ip4_route_for_each (&iter, self, &r) {
|
|
|
|
|
if (i == j)
|
|
|
|
|
return r;
|
|
|
|
|
j++;
|
2017-06-12 18:40:14 +02:00
|
|
|
}
|
|
|
|
|
g_return_val_if_reached (NULL);
|
2008-12-19 17:01:06 -05:00
|
|
|
}
|
|
|
|
|
|
2014-08-28 23:36:45 +02:00
|
|
|
const NMPlatformIP4Route *
|
2017-06-12 18:40:14 +02:00
|
|
|
nm_ip4_config_get_direct_route_for_host (const NMIP4Config *self, guint32 host)
|
2014-08-28 23:36:45 +02:00
|
|
|
{
|
2017-06-12 18:40:14 +02:00
|
|
|
const NMPlatformIP4Route *best_route = NULL;
|
|
|
|
|
const NMPlatformIP4Route *item;
|
|
|
|
|
NMDedupMultiIter ipconf_iter;
|
2014-08-28 23:36:45 +02:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (host, NULL);
|
|
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_iter_ip4_route_for_each (&ipconf_iter, self, &item) {
|
2014-08-28 23:36:45 +02:00
|
|
|
if (item->gateway != 0)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (best_route && best_route->plen > item->plen)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (nm_utils_ip4_address_clear_host_address (host, item->plen) != nm_utils_ip4_address_clear_host_address (item->network, item->plen))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (best_route && best_route->metric <= item->metric)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
best_route = item;
|
|
|
|
|
}
|
|
|
|
|
return best_route;
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-07-12 11:33:52 +02:00
|
|
|
|
2008-06-02 08:44:48 +00:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_reset_nameservers (NMIP4Config *self)
|
2007-11-28 22:38:33 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2007-11-28 22:38:33 +00:00
|
|
|
|
2013-09-06 11:56:41 +02:00
|
|
|
if (priv->nameservers->len != 0) {
|
|
|
|
|
g_array_set_size (priv->nameservers, 0);
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_NAMESERVERS);
|
2013-09-06 11:56:41 +02:00
|
|
|
}
|
2007-11-28 22:38:33 +00:00
|
|
|
}
|
|
|
|
|
|
2008-06-02 08:44:48 +00:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_add_nameserver (NMIP4Config *self, guint32 new)
|
2007-11-28 22:38:33 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2013-07-12 11:33:52 +02:00
|
|
|
int i;
|
2007-11-28 22:38:33 +00:00
|
|
|
|
2013-07-15 17:56:46 -05:00
|
|
|
g_return_if_fail (new != 0);
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
for (i = 0; i < priv->nameservers->len; i++)
|
|
|
|
|
if (new == g_array_index (priv->nameservers, guint32, i))
|
2012-05-14 10:35:39 -04:00
|
|
|
return;
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
g_array_append_val (priv->nameservers, new);
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_NAMESERVERS);
|
2008-06-02 08:44:48 +00:00
|
|
|
}
|
|
|
|
|
|
2013-08-01 14:04:35 -05:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_del_nameserver (NMIP4Config *self, guint i)
|
2013-08-01 14:04:35 -05:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2013-08-01 14:04:35 -05:00
|
|
|
|
|
|
|
|
g_return_if_fail (i < priv->nameservers->len);
|
|
|
|
|
|
|
|
|
|
g_array_remove_index (priv->nameservers, i);
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_NAMESERVERS);
|
2013-08-01 14:04:35 -05:00
|
|
|
}
|
|
|
|
|
|
2016-10-14 06:08:41 +02:00
|
|
|
guint
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_num_nameservers (const NMIP4Config *self)
|
2008-06-02 08:44:48 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2008-08-10 22:37:21 +00:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
return priv->nameservers->len;
|
2008-06-02 08:44:48 +00:00
|
|
|
}
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
guint32
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_nameserver (const NMIP4Config *self, guint i)
|
2008-06-02 08:44:48 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2008-06-02 08:44:48 +00:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
return g_array_index (priv->nameservers, guint32, i);
|
2007-11-28 22:38:33 +00:00
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2007-11-28 22:38:33 +00:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_reset_domains (NMIP4Config *self)
|
2008-08-06 22:23:48 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2008-08-06 22:23:48 +00:00
|
|
|
|
2013-09-06 11:56:41 +02:00
|
|
|
if (priv->domains->len != 0) {
|
|
|
|
|
g_ptr_array_set_size (priv->domains, 0);
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_DOMAINS);
|
2013-09-06 11:56:41 +02:00
|
|
|
}
|
2008-08-06 22:23:48 +00:00
|
|
|
}
|
2008-03-09 05:11:22 +00:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_add_domain (NMIP4Config *self, const char *domain)
|
2008-03-09 05:11:22 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2009-05-11 20:02:07 -04:00
|
|
|
int i;
|
|
|
|
|
|
2013-07-15 17:56:46 -05:00
|
|
|
g_return_if_fail (domain != NULL);
|
|
|
|
|
g_return_if_fail (domain[0] != '\0');
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
for (i = 0; i < priv->domains->len; i++)
|
|
|
|
|
if (!g_strcmp0 (g_ptr_array_index (priv->domains, i), domain))
|
2009-05-11 20:02:07 -04:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
g_ptr_array_add (priv->domains, g_strdup (domain));
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_DOMAINS);
|
2008-03-09 05:11:22 +00:00
|
|
|
}
|
|
|
|
|
|
2013-08-01 14:04:35 -05:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_del_domain (NMIP4Config *self, guint i)
|
2013-08-01 14:04:35 -05:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2013-08-01 14:04:35 -05:00
|
|
|
|
|
|
|
|
g_return_if_fail (i < priv->domains->len);
|
|
|
|
|
|
|
|
|
|
g_ptr_array_remove_index (priv->domains, i);
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_DOMAINS);
|
2013-08-01 14:04:35 -05:00
|
|
|
}
|
|
|
|
|
|
2016-10-14 06:08:41 +02:00
|
|
|
guint
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_num_domains (const NMIP4Config *self)
|
2005-04-15 15:43:42 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2005-04-15 15:43:42 +00:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
return priv->domains->len;
|
2005-04-15 15:43:42 +00:00
|
|
|
}
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
const char *
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_domain (const NMIP4Config *self, guint i)
|
2005-04-15 15:43:42 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2005-04-15 15:43:42 +00:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
return g_ptr_array_index (priv->domains, i);
|
2005-04-15 15:43:42 +00:00
|
|
|
}
|
2005-10-28 03:16:02 +00:00
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2009-05-11 20:02:07 -04:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_reset_searches (NMIP4Config *self)
|
2013-07-12 11:33:52 +02:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2009-05-11 20:02:07 -04:00
|
|
|
|
2013-09-06 11:56:41 +02:00
|
|
|
if (priv->searches->len != 0) {
|
|
|
|
|
g_ptr_array_set_size (priv->searches, 0);
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_SEARCHES);
|
2013-09-06 11:56:41 +02:00
|
|
|
}
|
2009-05-11 20:02:07 -04:00
|
|
|
}
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_add_search (NMIP4Config *self, const char *new)
|
2008-03-09 05:11:22 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2015-12-01 16:55:34 +01:00
|
|
|
char *search;
|
|
|
|
|
size_t len;
|
2009-05-11 20:02:07 -04:00
|
|
|
|
2013-07-15 17:56:46 -05:00
|
|
|
g_return_if_fail (new != NULL);
|
|
|
|
|
g_return_if_fail (new[0] != '\0');
|
2009-05-11 20:02:07 -04:00
|
|
|
|
2015-12-01 16:55:34 +01:00
|
|
|
search = g_strdup (new);
|
|
|
|
|
|
|
|
|
|
/* Remove trailing dot as it has no effect */
|
|
|
|
|
len = strlen (search);
|
|
|
|
|
if (search[len - 1] == '.')
|
|
|
|
|
search[len - 1] = 0;
|
|
|
|
|
|
|
|
|
|
if (!search[0]) {
|
|
|
|
|
g_free (search);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2017-02-04 17:53:17 +01:00
|
|
|
if (nm_utils_strv_find_first ((char **) priv->searches->pdata,
|
2015-12-01 16:55:34 +01:00
|
|
|
priv->searches->len, search) >= 0) {
|
|
|
|
|
g_free (search);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2009-05-11 20:02:07 -04:00
|
|
|
|
2015-12-01 16:55:34 +01:00
|
|
|
g_ptr_array_add (priv->searches, search);
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_SEARCHES);
|
2008-03-09 05:11:22 +00:00
|
|
|
}
|
|
|
|
|
|
2013-08-01 14:04:35 -05:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_del_search (NMIP4Config *self, guint i)
|
2013-08-01 14:04:35 -05:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2013-08-01 14:04:35 -05:00
|
|
|
|
|
|
|
|
g_return_if_fail (i < priv->searches->len);
|
|
|
|
|
|
|
|
|
|
g_ptr_array_remove_index (priv->searches, i);
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_SEARCHES);
|
2013-08-01 14:04:35 -05:00
|
|
|
}
|
|
|
|
|
|
2016-10-14 06:08:41 +02:00
|
|
|
guint
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_num_searches (const NMIP4Config *self)
|
2008-03-09 05:11:22 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2008-03-09 05:11:22 +00:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
return priv->searches->len;
|
2008-03-09 05:11:22 +00:00
|
|
|
}
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
const char *
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_search (const NMIP4Config *self, guint i)
|
2008-03-09 05:11:22 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2008-03-09 05:11:22 +00:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
return g_ptr_array_index (priv->searches, i);
|
2008-03-09 05:11:22 +00:00
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-07-12 11:33:52 +02:00
|
|
|
|
2015-03-26 09:23:12 +01:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_reset_dns_options (NMIP4Config *self)
|
2015-03-26 09:23:12 +01:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2015-03-26 09:23:12 +01:00
|
|
|
|
|
|
|
|
if (priv->dns_options->len != 0) {
|
|
|
|
|
g_ptr_array_set_size (priv->dns_options, 0);
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_DNS_OPTIONS);
|
2015-03-26 09:23:12 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_add_dns_option (NMIP4Config *self, const char *new)
|
2015-03-26 09:23:12 +01:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2015-03-26 09:23:12 +01:00
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (new != NULL);
|
|
|
|
|
g_return_if_fail (new[0] != '\0');
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < priv->dns_options->len; i++)
|
|
|
|
|
if (!g_strcmp0 (g_ptr_array_index (priv->dns_options, i), new))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
g_ptr_array_add (priv->dns_options, g_strdup (new));
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_DNS_OPTIONS);
|
2015-03-26 09:23:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_del_dns_option(NMIP4Config *self, guint i)
|
2015-03-26 09:23:12 +01:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2015-03-26 09:23:12 +01:00
|
|
|
|
|
|
|
|
g_return_if_fail (i < priv->dns_options->len);
|
|
|
|
|
|
|
|
|
|
g_ptr_array_remove_index (priv->dns_options, i);
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_DNS_OPTIONS);
|
2015-03-26 09:23:12 +01:00
|
|
|
}
|
|
|
|
|
|
2016-10-14 06:08:41 +02:00
|
|
|
guint
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_num_dns_options (const NMIP4Config *self)
|
2015-03-26 09:23:12 +01:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2015-03-26 09:23:12 +01:00
|
|
|
|
|
|
|
|
return priv->dns_options->len;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char *
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_dns_option (const NMIP4Config *self, guint i)
|
2015-03-26 09:23:12 +01:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2015-03-26 09:23:12 +01:00
|
|
|
|
|
|
|
|
return g_ptr_array_index (priv->dns_options, i);
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2015-03-26 09:23:12 +01:00
|
|
|
|
2016-04-23 15:57:14 +02:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_set_dns_priority (NMIP4Config *self, gint priority)
|
2016-04-23 15:57:14 +02:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2016-04-23 15:57:14 +02:00
|
|
|
|
|
|
|
|
if (priority != priv->dns_priority) {
|
|
|
|
|
priv->dns_priority = priority;
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_DNS_PRIORITY);
|
2016-04-23 15:57:14 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gint
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_dns_priority (const NMIP4Config *self)
|
2016-04-23 15:57:14 +02:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2016-04-23 15:57:14 +02:00
|
|
|
|
|
|
|
|
return priv->dns_priority;
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2016-04-23 15:57:14 +02:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_set_mss (NMIP4Config *self, guint32 mss)
|
2008-05-23 07:35:43 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2008-05-23 07:35:43 +00:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
priv->mss = mss;
|
|
|
|
|
}
|
2008-05-23 07:35:43 +00:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
guint32
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_mss (const NMIP4Config *self)
|
2013-07-12 11:33:52 +02:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2013-07-12 11:33:52 +02:00
|
|
|
|
|
|
|
|
return priv->mss;
|
2008-05-23 07:35:43 +00:00
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-07-12 11:33:52 +02:00
|
|
|
|
|
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_reset_nis_servers (NMIP4Config *self)
|
2006-03-29 Robert Love <rml@novell.com>
Patch by Vinay R <rvinay@novell.com> and Robert Love <rml@novell.com>,
to add support for per-route MSS and improve support for per-interface
MTU:
* src/NetworkManagerSystem.c: Modify nm_system_device_set_ip4_route to
optionally take an MSS parameter and set it for the given route.
Remove nm_system_device_set_ip4_route_with_iface. Pass in the
NMIP4Config's stored MSS, if any.
* src/nm-ip4-config.c: Add 'mtu' and 'mss' to NMIP4Config, representing
the interface's MTU and the route's MSS, respectively. Add functions
nm_ip4_config_get_mtu, nm_ip4_config_set_mtu, nm_ip4_config_get_mss,
and nm_ip4_config_set_mss for retrieving and setting the MTU and the
MSS.
* src/nm-ip4-config.h: Add prototypes for nm_ip4_config_get_mtu,
nm_ip4_config_set_mtu, nm_ip4_config_get_mss, and
nm_ip4_config_set_mss.
* src/vpn-manager/nm-vpn-service.c: Modify to receive the MSS from the
VPN daemon.
* src/backends/NetworkManager{Arch,Debian,Gentoo,RedHat,Slackware,SUSE}.c:
Change the retval of nm_system_get_mtu to guint32.
* src/dhcp-manager/nm-dhcp-manager.c: Set the MTU on the new DHCP-given
NMIP4Config to the MTU provided by the system, if any. TODO: If DHCP
servers can specify MTU's, we should set it here if the MTU was not
provided.
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1660 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-29 19:26:53 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2006-03-29 Robert Love <rml@novell.com>
Patch by Vinay R <rvinay@novell.com> and Robert Love <rml@novell.com>,
to add support for per-route MSS and improve support for per-interface
MTU:
* src/NetworkManagerSystem.c: Modify nm_system_device_set_ip4_route to
optionally take an MSS parameter and set it for the given route.
Remove nm_system_device_set_ip4_route_with_iface. Pass in the
NMIP4Config's stored MSS, if any.
* src/nm-ip4-config.c: Add 'mtu' and 'mss' to NMIP4Config, representing
the interface's MTU and the route's MSS, respectively. Add functions
nm_ip4_config_get_mtu, nm_ip4_config_set_mtu, nm_ip4_config_get_mss,
and nm_ip4_config_set_mss for retrieving and setting the MTU and the
MSS.
* src/nm-ip4-config.h: Add prototypes for nm_ip4_config_get_mtu,
nm_ip4_config_set_mtu, nm_ip4_config_get_mss, and
nm_ip4_config_set_mss.
* src/vpn-manager/nm-vpn-service.c: Modify to receive the MSS from the
VPN daemon.
* src/backends/NetworkManager{Arch,Debian,Gentoo,RedHat,Slackware,SUSE}.c:
Change the retval of nm_system_get_mtu to guint32.
* src/dhcp-manager/nm-dhcp-manager.c: Set the MTU on the new DHCP-given
NMIP4Config to the MTU provided by the system, if any. TODO: If DHCP
servers can specify MTU's, we should set it here if the MTU was not
provided.
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1660 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-29 19:26:53 +00:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
g_array_set_size (priv->nis, 0);
|
2006-03-29 Robert Love <rml@novell.com>
Patch by Vinay R <rvinay@novell.com> and Robert Love <rml@novell.com>,
to add support for per-route MSS and improve support for per-interface
MTU:
* src/NetworkManagerSystem.c: Modify nm_system_device_set_ip4_route to
optionally take an MSS parameter and set it for the given route.
Remove nm_system_device_set_ip4_route_with_iface. Pass in the
NMIP4Config's stored MSS, if any.
* src/nm-ip4-config.c: Add 'mtu' and 'mss' to NMIP4Config, representing
the interface's MTU and the route's MSS, respectively. Add functions
nm_ip4_config_get_mtu, nm_ip4_config_set_mtu, nm_ip4_config_get_mss,
and nm_ip4_config_set_mss for retrieving and setting the MTU and the
MSS.
* src/nm-ip4-config.h: Add prototypes for nm_ip4_config_get_mtu,
nm_ip4_config_set_mtu, nm_ip4_config_get_mss, and
nm_ip4_config_set_mss.
* src/vpn-manager/nm-vpn-service.c: Modify to receive the MSS from the
VPN daemon.
* src/backends/NetworkManager{Arch,Debian,Gentoo,RedHat,Slackware,SUSE}.c:
Change the retval of nm_system_get_mtu to guint32.
* src/dhcp-manager/nm-dhcp-manager.c: Set the MTU on the new DHCP-given
NMIP4Config to the MTU provided by the system, if any. TODO: If DHCP
servers can specify MTU's, we should set it here if the MTU was not
provided.
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1660 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-29 19:26:53 +00:00
|
|
|
}
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_add_nis_server (NMIP4Config *self, guint32 nis)
|
2006-03-29 Robert Love <rml@novell.com>
Patch by Vinay R <rvinay@novell.com> and Robert Love <rml@novell.com>,
to add support for per-route MSS and improve support for per-interface
MTU:
* src/NetworkManagerSystem.c: Modify nm_system_device_set_ip4_route to
optionally take an MSS parameter and set it for the given route.
Remove nm_system_device_set_ip4_route_with_iface. Pass in the
NMIP4Config's stored MSS, if any.
* src/nm-ip4-config.c: Add 'mtu' and 'mss' to NMIP4Config, representing
the interface's MTU and the route's MSS, respectively. Add functions
nm_ip4_config_get_mtu, nm_ip4_config_set_mtu, nm_ip4_config_get_mss,
and nm_ip4_config_set_mss for retrieving and setting the MTU and the
MSS.
* src/nm-ip4-config.h: Add prototypes for nm_ip4_config_get_mtu,
nm_ip4_config_set_mtu, nm_ip4_config_get_mss, and
nm_ip4_config_set_mss.
* src/vpn-manager/nm-vpn-service.c: Modify to receive the MSS from the
VPN daemon.
* src/backends/NetworkManager{Arch,Debian,Gentoo,RedHat,Slackware,SUSE}.c:
Change the retval of nm_system_get_mtu to guint32.
* src/dhcp-manager/nm-dhcp-manager.c: Set the MTU on the new DHCP-given
NMIP4Config to the MTU provided by the system, if any. TODO: If DHCP
servers can specify MTU's, we should set it here if the MTU was not
provided.
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1660 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-29 19:26:53 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2013-07-12 11:33:52 +02:00
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < priv->nis->len; i++)
|
|
|
|
|
if (nis == g_array_index (priv->nis, guint32, i))
|
|
|
|
|
return;
|
2006-03-29 Robert Love <rml@novell.com>
Patch by Vinay R <rvinay@novell.com> and Robert Love <rml@novell.com>,
to add support for per-route MSS and improve support for per-interface
MTU:
* src/NetworkManagerSystem.c: Modify nm_system_device_set_ip4_route to
optionally take an MSS parameter and set it for the given route.
Remove nm_system_device_set_ip4_route_with_iface. Pass in the
NMIP4Config's stored MSS, if any.
* src/nm-ip4-config.c: Add 'mtu' and 'mss' to NMIP4Config, representing
the interface's MTU and the route's MSS, respectively. Add functions
nm_ip4_config_get_mtu, nm_ip4_config_set_mtu, nm_ip4_config_get_mss,
and nm_ip4_config_set_mss for retrieving and setting the MTU and the
MSS.
* src/nm-ip4-config.h: Add prototypes for nm_ip4_config_get_mtu,
nm_ip4_config_set_mtu, nm_ip4_config_get_mss, and
nm_ip4_config_set_mss.
* src/vpn-manager/nm-vpn-service.c: Modify to receive the MSS from the
VPN daemon.
* src/backends/NetworkManager{Arch,Debian,Gentoo,RedHat,Slackware,SUSE}.c:
Change the retval of nm_system_get_mtu to guint32.
* src/dhcp-manager/nm-dhcp-manager.c: Set the MTU on the new DHCP-given
NMIP4Config to the MTU provided by the system, if any. TODO: If DHCP
servers can specify MTU's, we should set it here if the MTU was not
provided.
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1660 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-29 19:26:53 +00:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
g_array_append_val (priv->nis, nis);
|
2006-03-29 Robert Love <rml@novell.com>
Patch by Vinay R <rvinay@novell.com> and Robert Love <rml@novell.com>,
to add support for per-route MSS and improve support for per-interface
MTU:
* src/NetworkManagerSystem.c: Modify nm_system_device_set_ip4_route to
optionally take an MSS parameter and set it for the given route.
Remove nm_system_device_set_ip4_route_with_iface. Pass in the
NMIP4Config's stored MSS, if any.
* src/nm-ip4-config.c: Add 'mtu' and 'mss' to NMIP4Config, representing
the interface's MTU and the route's MSS, respectively. Add functions
nm_ip4_config_get_mtu, nm_ip4_config_set_mtu, nm_ip4_config_get_mss,
and nm_ip4_config_set_mss for retrieving and setting the MTU and the
MSS.
* src/nm-ip4-config.h: Add prototypes for nm_ip4_config_get_mtu,
nm_ip4_config_set_mtu, nm_ip4_config_get_mss, and
nm_ip4_config_set_mss.
* src/vpn-manager/nm-vpn-service.c: Modify to receive the MSS from the
VPN daemon.
* src/backends/NetworkManager{Arch,Debian,Gentoo,RedHat,Slackware,SUSE}.c:
Change the retval of nm_system_get_mtu to guint32.
* src/dhcp-manager/nm-dhcp-manager.c: Set the MTU on the new DHCP-given
NMIP4Config to the MTU provided by the system, if any. TODO: If DHCP
servers can specify MTU's, we should set it here if the MTU was not
provided.
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1660 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-29 19:26:53 +00:00
|
|
|
}
|
2005-10-28 03:16:02 +00:00
|
|
|
|
2013-08-01 14:04:35 -05:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_del_nis_server (NMIP4Config *self, guint i)
|
2013-08-01 14:04:35 -05:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2013-08-01 14:04:35 -05:00
|
|
|
|
|
|
|
|
g_return_if_fail (i < priv->nis->len);
|
|
|
|
|
|
|
|
|
|
g_array_remove_index (priv->nis, i);
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-14 06:08:41 +02:00
|
|
|
guint
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_num_nis_servers (const NMIP4Config *self)
|
2008-12-09 20:01:49 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2008-12-09 20:01:49 +00:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
return priv->nis->len;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
guint32
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_nis_server (const NMIP4Config *self, guint i)
|
2013-07-12 11:33:52 +02:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2013-07-12 11:33:52 +02:00
|
|
|
|
|
|
|
|
return g_array_index (priv->nis, guint32, i);
|
2008-12-09 20:01:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_set_nis_domain (NMIP4Config *self, const char *domain)
|
2008-12-09 20:01:49 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2008-12-09 20:01:49 +00:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
g_free (priv->nis_domain);
|
|
|
|
|
priv->nis_domain = g_strdup (domain);
|
2008-12-09 20:01:49 +00:00
|
|
|
}
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
const char *
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_nis_domain (const NMIP4Config *self)
|
2010-07-16 11:28:39 -07:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2010-07-16 11:28:39 -07:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
return priv->nis_domain;
|
|
|
|
|
}
|
2010-07-16 11:28:39 -07:00
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2010-07-16 11:28:39 -07:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_reset_wins (NMIP4Config *self)
|
2013-07-12 11:33:52 +02:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2010-07-16 11:28:39 -07:00
|
|
|
|
2013-09-06 11:56:41 +02:00
|
|
|
if (priv->wins->len != 0) {
|
|
|
|
|
g_array_set_size (priv->wins, 0);
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_WINS_SERVERS);
|
2013-09-06 11:56:41 +02:00
|
|
|
}
|
2010-07-16 11:28:39 -07:00
|
|
|
}
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_add_wins (NMIP4Config *self, guint32 wins)
|
2010-07-16 11:28:39 -07:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2013-07-12 11:33:52 +02:00
|
|
|
int i;
|
|
|
|
|
|
2013-07-15 17:56:46 -05:00
|
|
|
g_return_if_fail (wins != 0);
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
for (i = 0; i < priv->wins->len; i++)
|
|
|
|
|
if (wins == g_array_index (priv->wins, guint32, i))
|
|
|
|
|
return;
|
2010-07-16 11:28:39 -07:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
g_array_append_val (priv->wins, wins);
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_WINS_SERVERS);
|
2010-07-16 11:28:39 -07:00
|
|
|
}
|
|
|
|
|
|
2013-08-01 14:04:35 -05:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_del_wins (NMIP4Config *self, guint i)
|
2013-08-01 14:04:35 -05:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2013-08-01 14:04:35 -05:00
|
|
|
|
|
|
|
|
g_return_if_fail (i < priv->wins->len);
|
|
|
|
|
|
|
|
|
|
g_array_remove_index (priv->wins, i);
|
2017-07-10 14:03:44 +02:00
|
|
|
_notify (self, PROP_WINS_SERVERS);
|
2013-08-01 14:04:35 -05:00
|
|
|
}
|
|
|
|
|
|
2016-10-14 06:08:41 +02:00
|
|
|
guint
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_num_wins (const NMIP4Config *self)
|
2010-07-16 11:28:39 -07:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2010-07-16 11:28:39 -07:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
return priv->wins->len;
|
2010-07-16 11:28:39 -07:00
|
|
|
}
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
guint32
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_wins (const NMIP4Config *self, guint i)
|
2010-07-16 11:28:39 -07:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2010-07-16 11:28:39 -07:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
return g_array_index (priv->wins, guint32, i);
|
2010-07-16 11:28:39 -07:00
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-07-12 11:33:52 +02:00
|
|
|
|
2010-07-16 11:28:39 -07:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_set_mtu (NMIP4Config *self, guint32 mtu, NMIPConfigSource source)
|
2010-07-16 11:28:39 -07:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2010-07-16 11:28:39 -07:00
|
|
|
|
2017-01-15 12:57:50 +01:00
|
|
|
if (!mtu)
|
|
|
|
|
source = NM_IP_CONFIG_SOURCE_UNKNOWN;
|
|
|
|
|
|
|
|
|
|
priv->mtu = mtu;
|
|
|
|
|
priv->mtu_source = source;
|
2010-07-16 11:28:39 -07:00
|
|
|
}
|
|
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
guint32
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_mtu (const NMIP4Config *self)
|
2010-07-16 11:28:39 -07:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2010-07-16 11:28:39 -07:00
|
|
|
|
2013-07-12 11:33:52 +02:00
|
|
|
return priv->mtu;
|
2010-07-16 11:28:39 -07:00
|
|
|
}
|
|
|
|
|
|
2014-10-09 18:51:11 +02:00
|
|
|
NMIPConfigSource
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_mtu_source (const NMIP4Config *self)
|
2014-10-09 18:51:11 +02:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2014-10-09 18:51:11 +02:00
|
|
|
|
|
|
|
|
return priv->mtu_source;
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-07-12 11:33:52 +02:00
|
|
|
|
2015-04-30 18:11:16 +02:00
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_set_metered (NMIP4Config *self, gboolean metered)
|
2015-04-30 18:11:16 +02:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2015-04-30 18:11:16 +02:00
|
|
|
|
2017-01-15 12:33:10 +01:00
|
|
|
priv->metered = metered;
|
2015-04-30 18:11:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_get_metered (const NMIP4Config *self)
|
2015-04-30 18:11:16 +02:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2015-04-30 18:11:16 +02:00
|
|
|
|
|
|
|
|
return priv->metered;
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2015-04-30 18:11:16 +02:00
|
|
|
|
2017-08-31 13:39:04 +02:00
|
|
|
const NMPObject *
|
|
|
|
|
nm_ip4_config_nmpobj_lookup (const NMIP4Config *self, const NMPObject *needle)
|
|
|
|
|
{
|
|
|
|
|
const NMIP4ConfigPrivate *priv;
|
|
|
|
|
const NMDedupMultiIdxType *idx_type;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (NM_IS_IP4_CONFIG (self), NULL);
|
|
|
|
|
|
|
|
|
|
priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
|
|
|
|
switch (NMP_OBJECT_GET_TYPE (needle)) {
|
|
|
|
|
case NMP_OBJECT_TYPE_IP4_ADDRESS:
|
|
|
|
|
idx_type = &priv->idx_ip4_addresses;
|
|
|
|
|
break;
|
|
|
|
|
case NMP_OBJECT_TYPE_IP4_ROUTE:
|
|
|
|
|
idx_type = &priv->idx_ip4_routes;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
g_return_val_if_reached (NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nm_dedup_multi_entry_get_obj (nm_dedup_multi_index_lookup_obj (priv->multi_idx,
|
|
|
|
|
idx_type,
|
|
|
|
|
needle));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
|
|
|
|
nm_ip4_config_nmpobj_remove (NMIP4Config *self,
|
|
|
|
|
const NMPObject *needle)
|
|
|
|
|
{
|
|
|
|
|
NMIP4ConfigPrivate *priv;
|
|
|
|
|
NMDedupMultiIdxType *idx_type;
|
|
|
|
|
nm_auto_nmpobj const NMPObject *obj_old = NULL;
|
|
|
|
|
guint n;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (NM_IS_IP4_CONFIG (self), FALSE);
|
|
|
|
|
|
|
|
|
|
priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
|
|
|
|
switch (NMP_OBJECT_GET_TYPE (needle)) {
|
|
|
|
|
case NMP_OBJECT_TYPE_IP4_ADDRESS:
|
|
|
|
|
idx_type = &priv->idx_ip4_addresses;
|
|
|
|
|
break;
|
|
|
|
|
case NMP_OBJECT_TYPE_IP4_ROUTE:
|
|
|
|
|
idx_type = &priv->idx_ip4_routes;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
g_return_val_if_reached (FALSE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
n = nm_dedup_multi_index_remove_obj (priv->multi_idx,
|
|
|
|
|
idx_type,
|
|
|
|
|
needle,
|
|
|
|
|
(gconstpointer *) &obj_old);
|
|
|
|
|
if (n != 1) {
|
|
|
|
|
nm_assert (n == 0);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nm_assert (NMP_OBJECT_GET_TYPE (obj_old) == NMP_OBJECT_GET_TYPE (needle));
|
|
|
|
|
|
|
|
|
|
switch (NMP_OBJECT_GET_TYPE (obj_old)) {
|
|
|
|
|
case NMP_OBJECT_TYPE_IP4_ADDRESS:
|
|
|
|
|
_notify_addresses (self);
|
|
|
|
|
break;
|
|
|
|
|
case NMP_OBJECT_TYPE_IP4_ROUTE:
|
|
|
|
|
if (priv->best_default_route == obj_old) {
|
|
|
|
|
_nm_ip_config_best_default_route_set (&priv->best_default_route,
|
|
|
|
|
_nm_ip4_config_best_default_route_find (self));
|
|
|
|
|
}
|
|
|
|
|
_notify_routes (self);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
nm_assert_not_reached ();
|
|
|
|
|
}
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2012-05-29 22:24:51 -05:00
|
|
|
static inline void
|
|
|
|
|
hash_u32 (GChecksum *sum, guint32 n)
|
|
|
|
|
{
|
|
|
|
|
g_checksum_update (sum, (const guint8 *) &n, sizeof (n));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_hash (const NMIP4Config *self, GChecksum *sum, gboolean dns_only)
|
2012-05-29 22:24:51 -05:00
|
|
|
{
|
2016-10-14 06:08:41 +02:00
|
|
|
guint i;
|
2012-05-29 22:24:51 -05:00
|
|
|
const char *s;
|
2017-06-12 18:40:14 +02:00
|
|
|
NMDedupMultiIter ipconf_iter;
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMPlatformIP4Address *address;
|
2017-06-12 18:40:14 +02:00
|
|
|
const NMPlatformIP4Route *route;
|
2012-05-29 22:24:51 -05:00
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
g_return_if_fail (self);
|
2013-07-04 15:40:01 +02:00
|
|
|
g_return_if_fail (sum);
|
2012-05-29 22:24:51 -05:00
|
|
|
|
2013-07-04 15:40:01 +02:00
|
|
|
if (!dns_only) {
|
2017-07-10 14:03:44 +02:00
|
|
|
hash_u32 (sum, nm_ip4_config_has_gateway (self));
|
|
|
|
|
hash_u32 (sum, nm_ip4_config_get_gateway (self));
|
2013-07-12 11:33:52 +02:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_iter_ip4_address_for_each (&ipconf_iter, self, &address) {
|
2013-06-29 13:33:36 +02:00
|
|
|
hash_u32 (sum, address->address);
|
|
|
|
|
hash_u32 (sum, address->plen);
|
2017-09-05 15:25:34 +02:00
|
|
|
hash_u32 (sum, address->peer_address & _nm_utils_ip4_prefix_to_netmask (address->plen));
|
2012-05-29 22:24:51 -05:00
|
|
|
}
|
|
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_iter_ip4_route_for_each (&ipconf_iter, self, &route) {
|
2013-07-31 23:07:32 +02:00
|
|
|
hash_u32 (sum, route->network);
|
|
|
|
|
hash_u32 (sum, route->plen);
|
|
|
|
|
hash_u32 (sum, route->gateway);
|
|
|
|
|
hash_u32 (sum, route->metric);
|
2012-05-29 22:24:51 -05:00
|
|
|
}
|
|
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
for (i = 0; i < nm_ip4_config_get_num_nis_servers (self); i++)
|
|
|
|
|
hash_u32 (sum, nm_ip4_config_get_nis_server (self, i));
|
2012-05-29 22:24:51 -05:00
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
s = nm_ip4_config_get_nis_domain (self);
|
2012-05-29 22:24:51 -05:00
|
|
|
if (s)
|
|
|
|
|
g_checksum_update (sum, (const guint8 *) s, strlen (s));
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
for (i = 0; i < nm_ip4_config_get_num_nameservers (self); i++)
|
|
|
|
|
hash_u32 (sum, nm_ip4_config_get_nameserver (self, i));
|
2012-05-29 22:24:51 -05:00
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
for (i = 0; i < nm_ip4_config_get_num_wins (self); i++)
|
|
|
|
|
hash_u32 (sum, nm_ip4_config_get_wins (self, i));
|
2012-05-29 22:24:51 -05:00
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
for (i = 0; i < nm_ip4_config_get_num_domains (self); i++) {
|
|
|
|
|
s = nm_ip4_config_get_domain (self, i);
|
2012-05-29 22:24:51 -05:00
|
|
|
g_checksum_update (sum, (const guint8 *) s, strlen (s));
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
for (i = 0; i < nm_ip4_config_get_num_searches (self); i++) {
|
|
|
|
|
s = nm_ip4_config_get_search (self, i);
|
2012-05-29 22:24:51 -05:00
|
|
|
g_checksum_update (sum, (const guint8 *) s, strlen (s));
|
|
|
|
|
}
|
2015-03-26 09:23:12 +01:00
|
|
|
|
2017-07-10 14:03:44 +02:00
|
|
|
for (i = 0; i < nm_ip4_config_get_num_dns_options (self); i++) {
|
|
|
|
|
s = nm_ip4_config_get_dns_option (self, i);
|
2015-03-26 09:23:12 +01:00
|
|
|
g_checksum_update (sum, (const guint8 *) s, strlen (s));
|
|
|
|
|
}
|
2012-05-29 22:24:51 -05:00
|
|
|
}
|
|
|
|
|
|
2014-01-06 14:14:14 -06:00
|
|
|
/**
|
|
|
|
|
* nm_ip4_config_equal:
|
|
|
|
|
* @a: first config to compare
|
|
|
|
|
* @b: second config to compare
|
|
|
|
|
*
|
|
|
|
|
* Compares two #NMIP4Configs for basic equality. This means that all
|
|
|
|
|
* attributes must exist in the same order in both configs (addresses, routes,
|
|
|
|
|
* domains, DNS servers, etc) but some attributes (address lifetimes, and address
|
|
|
|
|
* and route sources) are ignored.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE if the configurations are basically equal to each other,
|
|
|
|
|
* %FALSE if not
|
|
|
|
|
*/
|
2013-07-04 15:40:01 +02:00
|
|
|
gboolean
|
2013-09-25 13:08:53 +02:00
|
|
|
nm_ip4_config_equal (const NMIP4Config *a, const NMIP4Config *b)
|
2013-07-04 15:40:01 +02:00
|
|
|
{
|
|
|
|
|
GChecksum *a_checksum = g_checksum_new (G_CHECKSUM_SHA1);
|
|
|
|
|
GChecksum *b_checksum = g_checksum_new (G_CHECKSUM_SHA1);
|
|
|
|
|
gsize a_len = g_checksum_type_get_length (G_CHECKSUM_SHA1);
|
|
|
|
|
gsize b_len = g_checksum_type_get_length (G_CHECKSUM_SHA1);
|
|
|
|
|
guchar a_data[a_len], b_data[b_len];
|
|
|
|
|
gboolean equal;
|
|
|
|
|
|
|
|
|
|
if (a)
|
|
|
|
|
nm_ip4_config_hash (a, a_checksum, FALSE);
|
|
|
|
|
if (b)
|
|
|
|
|
nm_ip4_config_hash (b, b_checksum, FALSE);
|
|
|
|
|
|
|
|
|
|
g_checksum_get_digest (a_checksum, a_data, &a_len);
|
|
|
|
|
g_checksum_get_digest (b_checksum, b_data, &b_len);
|
|
|
|
|
|
|
|
|
|
g_assert (a_len == b_len);
|
|
|
|
|
equal = !memcmp (a_data, b_data, a_len);
|
|
|
|
|
|
|
|
|
|
g_checksum_free (a_checksum);
|
|
|
|
|
g_checksum_free (b_checksum);
|
|
|
|
|
|
|
|
|
|
return equal;
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-07-12 11:33:52 +02:00
|
|
|
|
2007-02-16 11:23:49 +00:00
|
|
|
static void
|
|
|
|
|
get_property (GObject *object, guint prop_id,
|
2016-08-19 14:46:52 +02:00
|
|
|
GValue *value, GParamSpec *pspec)
|
2007-02-16 11:23:49 +00:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4Config *self = NM_IP4_CONFIG (object);
|
|
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2017-07-07 23:34:41 +02:00
|
|
|
const NMDedupMultiHeadEntry *head_entry;
|
2017-06-12 18:40:14 +02:00
|
|
|
NMDedupMultiIter ipconf_iter;
|
|
|
|
|
const NMPlatformIP4Route *route;
|
2017-07-07 23:34:41 +02:00
|
|
|
GVariantBuilder builder_data, builder_legacy;
|
2007-02-16 11:23:49 +00:00
|
|
|
|
|
|
|
|
switch (prop_id) {
|
2015-02-20 16:31:10 -06:00
|
|
|
case PROP_IFINDEX:
|
|
|
|
|
g_value_set_int (value, priv->ifindex);
|
|
|
|
|
break;
|
libnm-core, libnm, core: add AddressData and RouteData properties
Add AddressData and RouteData properties to NMSettingIPConfig and
NMIP[46]Config. These are like the existing "addresses" and "routes"
properties, but using strings and containing additional attributes,
like NMIPAddress and NMIPRoute.
This only affects the D-Bus representations; there are no API changes
to NMSettingIP{,4,6}Config or NMIP{4,6}Config as a result of this; the
additional information is just added to the existing 'addresses' and
'routes' properties.
NMSettingIP4Config and NMSettingIP6Config now always generate both
old-style data ('addresses', 'address-labels', 'routes') and new-style
data ('address-data', 'gateway', 'route-data') when serializing to
D-Bus, for backward compatibility. When deserializing, they will fill
in the 'addresses' and 'routes' properties from the new-style data if
it is present (ignoring the old-style data), or from the old-style
data if the new-style isn't present.
The daemon-side NMIP4Config and NMIP6Config always emit changes for
both 'Addresses'/'Routes' and 'AddressData'/'RouteData'. The
libnm-side classes initially listen for changes on both properties,
but start ignoring the 'Addresses' and 'Routes' properties once they
know the daemon is also providing 'AddressData' and 'RouteData'.
2014-10-21 08:33:18 -04:00
|
|
|
case PROP_ADDRESS_DATA:
|
2016-11-18 11:52:38 +01:00
|
|
|
case PROP_ADDRESSES:
|
2017-07-11 13:20:23 +02:00
|
|
|
nm_assert (!!priv->address_data_variant == !!priv->addresses_variant);
|
2016-11-18 11:52:38 +01:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
if (priv->address_data_variant)
|
2017-07-11 13:20:23 +02:00
|
|
|
goto out_addresses_cached;
|
libnm-core, libnm, core: add AddressData and RouteData properties
Add AddressData and RouteData properties to NMSettingIPConfig and
NMIP[46]Config. These are like the existing "addresses" and "routes"
properties, but using strings and containing additional attributes,
like NMIPAddress and NMIPRoute.
This only affects the D-Bus representations; there are no API changes
to NMSettingIP{,4,6}Config or NMIP{4,6}Config as a result of this; the
additional information is just added to the existing 'addresses' and
'routes' properties.
NMSettingIP4Config and NMSettingIP6Config now always generate both
old-style data ('addresses', 'address-labels', 'routes') and new-style
data ('address-data', 'gateway', 'route-data') when serializing to
D-Bus, for backward compatibility. When deserializing, they will fill
in the 'addresses' and 'routes' properties from the new-style data if
it is present (ignoring the old-style data), or from the old-style
data if the new-style isn't present.
The daemon-side NMIP4Config and NMIP6Config always emit changes for
both 'Addresses'/'Routes' and 'AddressData'/'RouteData'. The
libnm-side classes initially listen for changes on both properties,
but start ignoring the 'Addresses' and 'Routes' properties once they
know the daemon is also providing 'AddressData' and 'RouteData'.
2014-10-21 08:33:18 -04:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
g_variant_builder_init (&builder_data, G_VARIANT_TYPE ("aa{sv}"));
|
|
|
|
|
g_variant_builder_init (&builder_legacy, G_VARIANT_TYPE ("aau"));
|
2016-11-18 11:52:38 +01:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
head_entry = nm_ip4_config_lookup_addresses (self);
|
|
|
|
|
if (head_entry) {
|
|
|
|
|
gs_free const NMPObject **addresses = NULL;
|
|
|
|
|
guint naddr, i;
|
|
|
|
|
|
|
|
|
|
addresses = (const NMPObject **) nm_dedup_multi_objs_to_array_head (head_entry, NULL, NULL, &naddr);
|
|
|
|
|
nm_assert (addresses && naddr);
|
|
|
|
|
|
|
|
|
|
g_qsort_with_data (addresses,
|
|
|
|
|
naddr,
|
|
|
|
|
sizeof (addresses[0]),
|
|
|
|
|
_addresses_sort_cmp,
|
|
|
|
|
NULL);
|
2016-11-18 11:52:38 +01:00
|
|
|
|
|
|
|
|
/* Build address data variant */
|
libnm-core, libnm, core: add AddressData and RouteData properties
Add AddressData and RouteData properties to NMSettingIPConfig and
NMIP[46]Config. These are like the existing "addresses" and "routes"
properties, but using strings and containing additional attributes,
like NMIPAddress and NMIPRoute.
This only affects the D-Bus representations; there are no API changes
to NMSettingIP{,4,6}Config or NMIP{4,6}Config as a result of this; the
additional information is just added to the existing 'addresses' and
'routes' properties.
NMSettingIP4Config and NMSettingIP6Config now always generate both
old-style data ('addresses', 'address-labels', 'routes') and new-style
data ('address-data', 'gateway', 'route-data') when serializing to
D-Bus, for backward compatibility. When deserializing, they will fill
in the 'addresses' and 'routes' properties from the new-style data if
it is present (ignoring the old-style data), or from the old-style
data if the new-style isn't present.
The daemon-side NMIP4Config and NMIP6Config always emit changes for
both 'Addresses'/'Routes' and 'AddressData'/'RouteData'. The
libnm-side classes initially listen for changes on both properties,
but start ignoring the 'Addresses' and 'Routes' properties once they
know the daemon is also providing 'AddressData' and 'RouteData'.
2014-10-21 08:33:18 -04:00
|
|
|
for (i = 0; i < naddr; i++) {
|
2017-07-07 23:34:41 +02:00
|
|
|
GVariantBuilder addr_builder;
|
|
|
|
|
const NMPlatformIP4Address *address = NMP_OBJECT_CAST_IP4_ADDRESS (addresses[i]);
|
2014-11-07 10:55:58 -05:00
|
|
|
|
2015-04-15 14:53:30 -04:00
|
|
|
g_variant_builder_init (&addr_builder, G_VARIANT_TYPE ("a{sv}"));
|
|
|
|
|
g_variant_builder_add (&addr_builder, "{sv}",
|
|
|
|
|
"address",
|
|
|
|
|
g_variant_new_string (nm_utils_inet4_ntop (address->address, NULL)));
|
|
|
|
|
g_variant_builder_add (&addr_builder, "{sv}",
|
|
|
|
|
"prefix",
|
|
|
|
|
g_variant_new_uint32 (address->plen));
|
2015-10-21 23:17:11 +02:00
|
|
|
if (address->peer_address != address->address) {
|
2015-10-11 17:13:25 +02:00
|
|
|
g_variant_builder_add (&addr_builder, "{sv}",
|
|
|
|
|
"peer",
|
|
|
|
|
g_variant_new_string (nm_utils_inet4_ntop (address->peer_address, NULL)));
|
|
|
|
|
}
|
2014-11-07 10:55:58 -05:00
|
|
|
|
|
|
|
|
if (*address->label) {
|
2015-04-15 14:53:30 -04:00
|
|
|
g_variant_builder_add (&addr_builder, "{sv}",
|
|
|
|
|
"label",
|
|
|
|
|
g_variant_new_string (address->label));
|
2014-11-07 10:55:58 -05:00
|
|
|
}
|
libnm-core, libnm, core: add AddressData and RouteData properties
Add AddressData and RouteData properties to NMSettingIPConfig and
NMIP[46]Config. These are like the existing "addresses" and "routes"
properties, but using strings and containing additional attributes,
like NMIPAddress and NMIPRoute.
This only affects the D-Bus representations; there are no API changes
to NMSettingIP{,4,6}Config or NMIP{4,6}Config as a result of this; the
additional information is just added to the existing 'addresses' and
'routes' properties.
NMSettingIP4Config and NMSettingIP6Config now always generate both
old-style data ('addresses', 'address-labels', 'routes') and new-style
data ('address-data', 'gateway', 'route-data') when serializing to
D-Bus, for backward compatibility. When deserializing, they will fill
in the 'addresses' and 'routes' properties from the new-style data if
it is present (ignoring the old-style data), or from the old-style
data if the new-style isn't present.
The daemon-side NMIP4Config and NMIP6Config always emit changes for
both 'Addresses'/'Routes' and 'AddressData'/'RouteData'. The
libnm-side classes initially listen for changes on both properties,
but start ignoring the 'Addresses' and 'Routes' properties once they
know the daemon is also providing 'AddressData' and 'RouteData'.
2014-10-21 08:33:18 -04:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
g_variant_builder_add (&builder_data, "a{sv}", &addr_builder);
|
2013-06-29 13:33:36 +02:00
|
|
|
|
2017-07-11 13:20:23 +02:00
|
|
|
{
|
|
|
|
|
const guint32 dbus_addr[3] = {
|
|
|
|
|
address->address,
|
|
|
|
|
address->plen,
|
|
|
|
|
i == 0 ? priv->gateway : 0,
|
|
|
|
|
};
|
2013-06-29 13:33:36 +02:00
|
|
|
|
2017-07-11 13:20:23 +02:00
|
|
|
g_variant_builder_add (&builder_legacy, "@au",
|
|
|
|
|
g_variant_new_fixed_array (G_VARIANT_TYPE_UINT32,
|
|
|
|
|
dbus_addr, 3, sizeof (guint32)));
|
|
|
|
|
}
|
2013-06-29 13:33:36 +02:00
|
|
|
}
|
2017-07-07 23:34:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
priv->address_data_variant = g_variant_ref_sink (g_variant_builder_end (&builder_data));
|
|
|
|
|
priv->addresses_variant = g_variant_ref_sink (g_variant_builder_end (&builder_legacy));
|
2013-06-29 13:33:36 +02:00
|
|
|
|
2017-07-11 13:20:23 +02:00
|
|
|
out_addresses_cached:
|
2017-07-07 23:34:41 +02:00
|
|
|
g_value_set_variant (value,
|
|
|
|
|
prop_id == PROP_ADDRESS_DATA ?
|
|
|
|
|
priv->address_data_variant :
|
|
|
|
|
priv->addresses_variant);
|
2007-02-16 11:23:49 +00:00
|
|
|
break;
|
libnm-core, libnm, core: add AddressData and RouteData properties
Add AddressData and RouteData properties to NMSettingIPConfig and
NMIP[46]Config. These are like the existing "addresses" and "routes"
properties, but using strings and containing additional attributes,
like NMIPAddress and NMIPRoute.
This only affects the D-Bus representations; there are no API changes
to NMSettingIP{,4,6}Config or NMIP{4,6}Config as a result of this; the
additional information is just added to the existing 'addresses' and
'routes' properties.
NMSettingIP4Config and NMSettingIP6Config now always generate both
old-style data ('addresses', 'address-labels', 'routes') and new-style
data ('address-data', 'gateway', 'route-data') when serializing to
D-Bus, for backward compatibility. When deserializing, they will fill
in the 'addresses' and 'routes' properties from the new-style data if
it is present (ignoring the old-style data), or from the old-style
data if the new-style isn't present.
The daemon-side NMIP4Config and NMIP6Config always emit changes for
both 'Addresses'/'Routes' and 'AddressData'/'RouteData'. The
libnm-side classes initially listen for changes on both properties,
but start ignoring the 'Addresses' and 'Routes' properties once they
know the daemon is also providing 'AddressData' and 'RouteData'.
2014-10-21 08:33:18 -04:00
|
|
|
case PROP_ROUTE_DATA:
|
2017-07-11 13:20:23 +02:00
|
|
|
case PROP_ROUTES:
|
|
|
|
|
nm_assert (!!priv->route_data_variant == !!priv->routes_variant);
|
2017-07-07 23:34:41 +02:00
|
|
|
|
2017-07-11 13:20:23 +02:00
|
|
|
if (priv->route_data_variant)
|
|
|
|
|
goto out_routes_cached;
|
2014-11-07 10:55:58 -05:00
|
|
|
|
2017-07-11 13:20:23 +02:00
|
|
|
g_variant_builder_init (&builder_data, G_VARIANT_TYPE ("aa{sv}"));
|
|
|
|
|
g_variant_builder_init (&builder_legacy, G_VARIANT_TYPE ("aau"));
|
2014-08-29 00:03:47 +02:00
|
|
|
|
2017-07-11 13:20:23 +02:00
|
|
|
nm_ip_config_iter_ip4_route_for_each (&ipconf_iter, self, &route) {
|
|
|
|
|
GVariantBuilder route_builder;
|
|
|
|
|
|
2017-07-19 11:30:13 +02:00
|
|
|
nm_assert (_route_valid (route));
|
|
|
|
|
|
2017-07-11 13:20:23 +02:00
|
|
|
g_variant_builder_init (&route_builder, G_VARIANT_TYPE ("a{sv}"));
|
|
|
|
|
g_variant_builder_add (&route_builder, "{sv}",
|
|
|
|
|
"dest",
|
|
|
|
|
g_variant_new_string (nm_utils_inet4_ntop (route->network, NULL)));
|
|
|
|
|
g_variant_builder_add (&route_builder, "{sv}",
|
|
|
|
|
"prefix",
|
|
|
|
|
g_variant_new_uint32 (route->plen));
|
|
|
|
|
if (route->gateway) {
|
|
|
|
|
g_variant_builder_add (&route_builder, "{sv}",
|
|
|
|
|
"next-hop",
|
|
|
|
|
g_variant_new_string (nm_utils_inet4_ntop (route->gateway, NULL)));
|
|
|
|
|
}
|
|
|
|
|
g_variant_builder_add (&route_builder, "{sv}",
|
|
|
|
|
"metric",
|
|
|
|
|
g_variant_new_uint32 (route->metric));
|
|
|
|
|
|
2017-09-13 17:42:41 +02:00
|
|
|
if (!nm_platform_route_table_is_main (route->table_coerced)) {
|
|
|
|
|
g_variant_builder_add (&route_builder, "{sv}",
|
|
|
|
|
"table",
|
|
|
|
|
g_variant_new_uint32 (nm_platform_route_table_uncoerce (route->table_coerced, TRUE)));
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-11 13:20:23 +02:00
|
|
|
g_variant_builder_add (&builder_data, "a{sv}", &route_builder);
|
|
|
|
|
|
|
|
|
|
/* legacy versions of nm_ip4_route_set_prefix() in libnm-util assert that the
|
|
|
|
|
* plen is positive. Skip the default routes not to break older clients. */
|
2017-09-13 17:42:41 +02:00
|
|
|
if ( nm_platform_route_table_is_main (route->table_coerced)
|
|
|
|
|
&& !NM_PLATFORM_IP_ROUTE_IS_DEFAULT (route)) {
|
2017-07-11 13:20:23 +02:00
|
|
|
const guint32 dbus_route[4] = {
|
|
|
|
|
route->network,
|
|
|
|
|
route->plen,
|
|
|
|
|
route->gateway,
|
|
|
|
|
route->metric,
|
|
|
|
|
};
|
2013-07-31 23:07:32 +02:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
g_variant_builder_add (&builder_legacy, "@au",
|
2015-04-15 14:53:30 -04:00
|
|
|
g_variant_new_fixed_array (G_VARIANT_TYPE_UINT32,
|
|
|
|
|
dbus_route, 4, sizeof (guint32)));
|
2013-07-31 23:07:32 +02:00
|
|
|
}
|
|
|
|
|
}
|
2017-07-11 13:20:23 +02:00
|
|
|
|
|
|
|
|
priv->route_data_variant = g_variant_ref_sink (g_variant_builder_end (&builder_data));
|
|
|
|
|
priv->routes_variant = g_variant_ref_sink (g_variant_builder_end (&builder_legacy));
|
|
|
|
|
|
|
|
|
|
out_routes_cached:
|
|
|
|
|
g_value_set_variant (value,
|
|
|
|
|
prop_id == PROP_ROUTE_DATA ?
|
|
|
|
|
priv->route_data_variant :
|
|
|
|
|
priv->routes_variant);
|
2013-07-12 11:33:52 +02:00
|
|
|
break;
|
libnm-core, libnm, core: add AddressData and RouteData properties
Add AddressData and RouteData properties to NMSettingIPConfig and
NMIP[46]Config. These are like the existing "addresses" and "routes"
properties, but using strings and containing additional attributes,
like NMIPAddress and NMIPRoute.
This only affects the D-Bus representations; there are no API changes
to NMSettingIP{,4,6}Config or NMIP{4,6}Config as a result of this; the
additional information is just added to the existing 'addresses' and
'routes' properties.
NMSettingIP4Config and NMSettingIP6Config now always generate both
old-style data ('addresses', 'address-labels', 'routes') and new-style
data ('address-data', 'gateway', 'route-data') when serializing to
D-Bus, for backward compatibility. When deserializing, they will fill
in the 'addresses' and 'routes' properties from the new-style data if
it is present (ignoring the old-style data), or from the old-style
data if the new-style isn't present.
The daemon-side NMIP4Config and NMIP6Config always emit changes for
both 'Addresses'/'Routes' and 'AddressData'/'RouteData'. The
libnm-side classes initially listen for changes on both properties,
but start ignoring the 'Addresses' and 'Routes' properties once they
know the daemon is also providing 'AddressData' and 'RouteData'.
2014-10-21 08:33:18 -04:00
|
|
|
case PROP_GATEWAY:
|
2015-07-21 23:07:34 +02:00
|
|
|
if (priv->has_gateway)
|
libnm-core, libnm, core: add AddressData and RouteData properties
Add AddressData and RouteData properties to NMSettingIPConfig and
NMIP[46]Config. These are like the existing "addresses" and "routes"
properties, but using strings and containing additional attributes,
like NMIPAddress and NMIPRoute.
This only affects the D-Bus representations; there are no API changes
to NMSettingIP{,4,6}Config or NMIP{4,6}Config as a result of this; the
additional information is just added to the existing 'addresses' and
'routes' properties.
NMSettingIP4Config and NMSettingIP6Config now always generate both
old-style data ('addresses', 'address-labels', 'routes') and new-style
data ('address-data', 'gateway', 'route-data') when serializing to
D-Bus, for backward compatibility. When deserializing, they will fill
in the 'addresses' and 'routes' properties from the new-style data if
it is present (ignoring the old-style data), or from the old-style
data if the new-style isn't present.
The daemon-side NMIP4Config and NMIP6Config always emit changes for
both 'Addresses'/'Routes' and 'AddressData'/'RouteData'. The
libnm-side classes initially listen for changes on both properties,
but start ignoring the 'Addresses' and 'Routes' properties once they
know the daemon is also providing 'AddressData' and 'RouteData'.
2014-10-21 08:33:18 -04:00
|
|
|
g_value_set_string (value, nm_utils_inet4_ntop (priv->gateway, NULL));
|
|
|
|
|
else
|
|
|
|
|
g_value_set_string (value, NULL);
|
|
|
|
|
break;
|
2007-02-16 11:23:49 +00:00
|
|
|
case PROP_NAMESERVERS:
|
2015-04-15 14:53:30 -04:00
|
|
|
g_value_take_variant (value,
|
|
|
|
|
g_variant_new_fixed_array (G_VARIANT_TYPE_UINT32,
|
|
|
|
|
priv->nameservers->data,
|
|
|
|
|
priv->nameservers->len,
|
|
|
|
|
sizeof (guint32)));
|
2007-02-16 11:23:49 +00:00
|
|
|
break;
|
|
|
|
|
case PROP_DOMAINS:
|
2015-04-15 14:53:30 -04:00
|
|
|
nm_utils_g_value_set_strv (value, priv->domains);
|
2007-02-16 11:23:49 +00:00
|
|
|
break;
|
2013-09-06 11:56:41 +02:00
|
|
|
case PROP_SEARCHES:
|
2015-04-15 14:53:30 -04:00
|
|
|
nm_utils_g_value_set_strv (value, priv->searches);
|
2013-09-06 11:56:41 +02:00
|
|
|
break;
|
2015-03-26 09:23:12 +01:00
|
|
|
case PROP_DNS_OPTIONS:
|
2015-04-15 14:53:30 -04:00
|
|
|
nm_utils_g_value_set_strv (value, priv->dns_options);
|
2015-03-26 09:23:12 +01:00
|
|
|
break;
|
2016-04-23 15:57:14 +02:00
|
|
|
case PROP_DNS_PRIORITY:
|
|
|
|
|
g_value_set_int (value, priv->dns_priority);
|
|
|
|
|
break;
|
2008-12-19 17:01:06 -05:00
|
|
|
case PROP_WINS_SERVERS:
|
2015-04-15 14:53:30 -04:00
|
|
|
g_value_take_variant (value,
|
|
|
|
|
g_variant_new_fixed_array (G_VARIANT_TYPE_UINT32,
|
|
|
|
|
priv->wins->data,
|
|
|
|
|
priv->wins->len,
|
|
|
|
|
sizeof (guint32)));
|
2008-12-19 17:01:06 -05:00
|
|
|
break;
|
2007-02-16 11:23:49 +00:00
|
|
|
default:
|
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-20 16:31:10 -06:00
|
|
|
static void
|
|
|
|
|
set_property (GObject *object,
|
|
|
|
|
guint prop_id,
|
|
|
|
|
const GValue *value,
|
|
|
|
|
GParamSpec *pspec)
|
|
|
|
|
{
|
2016-01-04 16:51:04 +01:00
|
|
|
NMIP4Config *self = NM_IP4_CONFIG (object);
|
|
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2015-02-20 16:31:10 -06:00
|
|
|
|
|
|
|
|
switch (prop_id) {
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
case PROP_MULTI_IDX:
|
|
|
|
|
/* construct-only */
|
|
|
|
|
priv->multi_idx = g_value_get_pointer (value);
|
|
|
|
|
if (!priv->multi_idx)
|
|
|
|
|
g_return_if_reached ();
|
|
|
|
|
nm_dedup_multi_index_ref (priv->multi_idx);
|
|
|
|
|
break;
|
2015-02-20 16:31:10 -06:00
|
|
|
case PROP_IFINDEX:
|
2017-01-15 12:15:58 +01:00
|
|
|
/* construct-only */
|
2015-02-20 16:31:10 -06:00
|
|
|
priv->ifindex = g_value_get_int (value);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-01-15 12:15:58 +01:00
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
static void
|
2017-07-10 14:03:44 +02:00
|
|
|
nm_ip4_config_init (NMIP4Config *self)
|
2017-01-15 12:15:58 +01:00
|
|
|
{
|
2017-07-10 14:03:44 +02:00
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
2017-01-15 12:15:58 +01:00
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_ip_config_dedup_multi_idx_type_init ((NMIPConfigDedupMultiIdxType *) &priv->idx_ip4_addresses,
|
|
|
|
|
NMP_OBJECT_TYPE_IP4_ADDRESS);
|
2017-06-12 18:40:14 +02:00
|
|
|
nm_ip_config_dedup_multi_idx_type_init ((NMIPConfigDedupMultiIdxType *) &priv->idx_ip4_routes,
|
|
|
|
|
NMP_OBJECT_TYPE_IP4_ROUTE);
|
|
|
|
|
|
2017-01-15 12:15:58 +01:00
|
|
|
priv->nameservers = g_array_new (FALSE, FALSE, sizeof (guint32));
|
|
|
|
|
priv->domains = g_ptr_array_new_with_free_func (g_free);
|
|
|
|
|
priv->searches = g_ptr_array_new_with_free_func (g_free);
|
|
|
|
|
priv->dns_options = g_ptr_array_new_with_free_func (g_free);
|
|
|
|
|
priv->nis = g_array_new (FALSE, TRUE, sizeof (guint32));
|
|
|
|
|
priv->wins = g_array_new (FALSE, TRUE, sizeof (guint32));
|
|
|
|
|
priv->route_metric = -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NMIP4Config *
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
nm_ip4_config_new (NMDedupMultiIndex *multi_idx, int ifindex)
|
2017-01-15 12:15:58 +01:00
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (ifindex >= -1, NULL);
|
|
|
|
|
return (NMIP4Config *) g_object_new (NM_TYPE_IP4_CONFIG,
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
NM_IP4_CONFIG_MULTI_IDX, multi_idx,
|
2017-01-15 12:15:58 +01:00
|
|
|
NM_IP4_CONFIG_IFINDEX, ifindex,
|
|
|
|
|
NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
finalize (GObject *object)
|
|
|
|
|
{
|
|
|
|
|
NMIP4Config *self = NM_IP4_CONFIG (object);
|
|
|
|
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
|
|
|
|
|
2017-08-31 13:39:04 +02:00
|
|
|
nm_clear_nmp_object (&priv->best_default_route);
|
|
|
|
|
|
2017-07-07 23:34:41 +02:00
|
|
|
nm_dedup_multi_index_remove_idx (priv->multi_idx, &priv->idx_ip4_addresses);
|
2017-06-12 18:40:14 +02:00
|
|
|
nm_dedup_multi_index_remove_idx (priv->multi_idx, &priv->idx_ip4_routes);
|
|
|
|
|
|
2017-01-15 12:15:58 +01:00
|
|
|
nm_clear_g_variant (&priv->address_data_variant);
|
|
|
|
|
nm_clear_g_variant (&priv->addresses_variant);
|
2017-07-11 13:20:23 +02:00
|
|
|
nm_clear_g_variant (&priv->route_data_variant);
|
|
|
|
|
nm_clear_g_variant (&priv->routes_variant);
|
|
|
|
|
|
2017-01-15 12:15:58 +01:00
|
|
|
g_array_unref (priv->nameservers);
|
|
|
|
|
g_ptr_array_unref (priv->domains);
|
|
|
|
|
g_ptr_array_unref (priv->searches);
|
|
|
|
|
g_ptr_array_unref (priv->dns_options);
|
|
|
|
|
g_array_unref (priv->nis);
|
|
|
|
|
g_free (priv->nis_domain);
|
|
|
|
|
g_array_unref (priv->wins);
|
|
|
|
|
|
|
|
|
|
G_OBJECT_CLASS (nm_ip4_config_parent_class)->finalize (object);
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
|
|
|
|
|
nm_dedup_multi_index_unref (priv->multi_idx);
|
2017-01-15 12:15:58 +01:00
|
|
|
}
|
|
|
|
|
|
2007-02-16 11:23:49 +00:00
|
|
|
static void
|
|
|
|
|
nm_ip4_config_class_init (NMIP4ConfigClass *config_class)
|
|
|
|
|
{
|
|
|
|
|
GObjectClass *object_class = G_OBJECT_CLASS (config_class);
|
2015-04-03 10:08:52 -04:00
|
|
|
NMExportedObjectClass *exported_object_class = NM_EXPORTED_OBJECT_CLASS (config_class);
|
2007-02-16 11:23:49 +00:00
|
|
|
|
2017-01-03 15:27:23 +01:00
|
|
|
exported_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/IP4Config");
|
2015-04-03 10:08:52 -04:00
|
|
|
|
2007-02-16 11:23:49 +00:00
|
|
|
object_class->get_property = get_property;
|
2015-02-20 16:31:10 -06:00
|
|
|
object_class->set_property = set_property;
|
2007-02-16 11:23:49 +00:00
|
|
|
object_class->finalize = finalize;
|
|
|
|
|
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
obj_properties[PROP_MULTI_IDX] =
|
|
|
|
|
g_param_spec_pointer (NM_IP4_CONFIG_MULTI_IDX, "", "",
|
|
|
|
|
G_PARAM_WRITABLE
|
|
|
|
|
| G_PARAM_CONSTRUCT_ONLY
|
|
|
|
|
| G_PARAM_STATIC_STRINGS);
|
2015-02-20 16:31:10 -06:00
|
|
|
obj_properties[PROP_IFINDEX] =
|
2016-07-06 10:20:06 +02:00
|
|
|
g_param_spec_int (NM_IP4_CONFIG_IFINDEX, "", "",
|
|
|
|
|
-1, G_MAXINT, -1,
|
|
|
|
|
G_PARAM_READWRITE |
|
|
|
|
|
G_PARAM_CONSTRUCT_ONLY |
|
|
|
|
|
G_PARAM_STATIC_STRINGS);
|
libnm-core, libnm, core: add AddressData and RouteData properties
Add AddressData and RouteData properties to NMSettingIPConfig and
NMIP[46]Config. These are like the existing "addresses" and "routes"
properties, but using strings and containing additional attributes,
like NMIPAddress and NMIPRoute.
This only affects the D-Bus representations; there are no API changes
to NMSettingIP{,4,6}Config or NMIP{4,6}Config as a result of this; the
additional information is just added to the existing 'addresses' and
'routes' properties.
NMSettingIP4Config and NMSettingIP6Config now always generate both
old-style data ('addresses', 'address-labels', 'routes') and new-style
data ('address-data', 'gateway', 'route-data') when serializing to
D-Bus, for backward compatibility. When deserializing, they will fill
in the 'addresses' and 'routes' properties from the new-style data if
it is present (ignoring the old-style data), or from the old-style
data if the new-style isn't present.
The daemon-side NMIP4Config and NMIP6Config always emit changes for
both 'Addresses'/'Routes' and 'AddressData'/'RouteData'. The
libnm-side classes initially listen for changes on both properties,
but start ignoring the 'Addresses' and 'Routes' properties once they
know the daemon is also providing 'AddressData' and 'RouteData'.
2014-10-21 08:33:18 -04:00
|
|
|
obj_properties[PROP_ADDRESS_DATA] =
|
2016-07-06 10:20:06 +02:00
|
|
|
g_param_spec_variant (NM_IP4_CONFIG_ADDRESS_DATA, "", "",
|
|
|
|
|
G_VARIANT_TYPE ("aa{sv}"),
|
|
|
|
|
NULL,
|
|
|
|
|
G_PARAM_READABLE |
|
|
|
|
|
G_PARAM_STATIC_STRINGS);
|
2013-09-06 11:56:41 +02:00
|
|
|
obj_properties[PROP_ADDRESSES] =
|
2016-07-06 10:20:06 +02:00
|
|
|
g_param_spec_variant (NM_IP4_CONFIG_ADDRESSES, "", "",
|
|
|
|
|
G_VARIANT_TYPE ("aau"),
|
|
|
|
|
NULL,
|
|
|
|
|
G_PARAM_READABLE |
|
|
|
|
|
G_PARAM_STATIC_STRINGS);
|
libnm-core, libnm, core: add AddressData and RouteData properties
Add AddressData and RouteData properties to NMSettingIPConfig and
NMIP[46]Config. These are like the existing "addresses" and "routes"
properties, but using strings and containing additional attributes,
like NMIPAddress and NMIPRoute.
This only affects the D-Bus representations; there are no API changes
to NMSettingIP{,4,6}Config or NMIP{4,6}Config as a result of this; the
additional information is just added to the existing 'addresses' and
'routes' properties.
NMSettingIP4Config and NMSettingIP6Config now always generate both
old-style data ('addresses', 'address-labels', 'routes') and new-style
data ('address-data', 'gateway', 'route-data') when serializing to
D-Bus, for backward compatibility. When deserializing, they will fill
in the 'addresses' and 'routes' properties from the new-style data if
it is present (ignoring the old-style data), or from the old-style
data if the new-style isn't present.
The daemon-side NMIP4Config and NMIP6Config always emit changes for
both 'Addresses'/'Routes' and 'AddressData'/'RouteData'. The
libnm-side classes initially listen for changes on both properties,
but start ignoring the 'Addresses' and 'Routes' properties once they
know the daemon is also providing 'AddressData' and 'RouteData'.
2014-10-21 08:33:18 -04:00
|
|
|
obj_properties[PROP_ROUTE_DATA] =
|
2016-07-06 10:20:06 +02:00
|
|
|
g_param_spec_variant (NM_IP4_CONFIG_ROUTE_DATA, "", "",
|
|
|
|
|
G_VARIANT_TYPE ("aa{sv}"),
|
|
|
|
|
NULL,
|
|
|
|
|
G_PARAM_READABLE |
|
|
|
|
|
G_PARAM_STATIC_STRINGS);
|
2013-09-06 11:56:41 +02:00
|
|
|
obj_properties[PROP_ROUTES] =
|
2016-07-06 10:20:06 +02:00
|
|
|
g_param_spec_variant (NM_IP4_CONFIG_ROUTES, "", "",
|
|
|
|
|
G_VARIANT_TYPE ("aau"),
|
|
|
|
|
NULL,
|
|
|
|
|
G_PARAM_READABLE |
|
|
|
|
|
G_PARAM_STATIC_STRINGS);
|
libnm-core, libnm, core: add AddressData and RouteData properties
Add AddressData and RouteData properties to NMSettingIPConfig and
NMIP[46]Config. These are like the existing "addresses" and "routes"
properties, but using strings and containing additional attributes,
like NMIPAddress and NMIPRoute.
This only affects the D-Bus representations; there are no API changes
to NMSettingIP{,4,6}Config or NMIP{4,6}Config as a result of this; the
additional information is just added to the existing 'addresses' and
'routes' properties.
NMSettingIP4Config and NMSettingIP6Config now always generate both
old-style data ('addresses', 'address-labels', 'routes') and new-style
data ('address-data', 'gateway', 'route-data') when serializing to
D-Bus, for backward compatibility. When deserializing, they will fill
in the 'addresses' and 'routes' properties from the new-style data if
it is present (ignoring the old-style data), or from the old-style
data if the new-style isn't present.
The daemon-side NMIP4Config and NMIP6Config always emit changes for
both 'Addresses'/'Routes' and 'AddressData'/'RouteData'. The
libnm-side classes initially listen for changes on both properties,
but start ignoring the 'Addresses' and 'Routes' properties once they
know the daemon is also providing 'AddressData' and 'RouteData'.
2014-10-21 08:33:18 -04:00
|
|
|
obj_properties[PROP_GATEWAY] =
|
2016-07-06 10:20:06 +02:00
|
|
|
g_param_spec_string (NM_IP4_CONFIG_GATEWAY, "", "",
|
|
|
|
|
NULL,
|
|
|
|
|
G_PARAM_READABLE |
|
|
|
|
|
G_PARAM_STATIC_STRINGS);
|
2013-09-06 11:56:41 +02:00
|
|
|
obj_properties[PROP_NAMESERVERS] =
|
2016-07-06 10:20:06 +02:00
|
|
|
g_param_spec_variant (NM_IP4_CONFIG_NAMESERVERS, "", "",
|
|
|
|
|
G_VARIANT_TYPE ("au"),
|
|
|
|
|
NULL,
|
|
|
|
|
G_PARAM_READABLE |
|
|
|
|
|
G_PARAM_STATIC_STRINGS);
|
2013-09-06 11:56:41 +02:00
|
|
|
obj_properties[PROP_DOMAINS] =
|
2016-07-06 10:20:06 +02:00
|
|
|
g_param_spec_boxed (NM_IP4_CONFIG_DOMAINS, "", "",
|
|
|
|
|
G_TYPE_STRV,
|
|
|
|
|
G_PARAM_READABLE |
|
|
|
|
|
G_PARAM_STATIC_STRINGS);
|
2013-09-06 11:56:41 +02:00
|
|
|
obj_properties[PROP_SEARCHES] =
|
2016-07-06 10:20:06 +02:00
|
|
|
g_param_spec_boxed (NM_IP4_CONFIG_SEARCHES, "", "",
|
|
|
|
|
G_TYPE_STRV,
|
|
|
|
|
G_PARAM_READABLE |
|
|
|
|
|
G_PARAM_STATIC_STRINGS);
|
2015-03-26 09:23:12 +01:00
|
|
|
obj_properties[PROP_DNS_OPTIONS] =
|
2016-07-06 10:20:06 +02:00
|
|
|
g_param_spec_boxed (NM_IP4_CONFIG_DNS_OPTIONS, "", "",
|
|
|
|
|
G_TYPE_STRV,
|
|
|
|
|
G_PARAM_READABLE |
|
|
|
|
|
G_PARAM_STATIC_STRINGS);
|
2016-04-23 15:57:14 +02:00
|
|
|
obj_properties[PROP_DNS_PRIORITY] =
|
2016-07-06 10:20:06 +02:00
|
|
|
g_param_spec_int (NM_IP4_CONFIG_DNS_PRIORITY, "", "",
|
|
|
|
|
G_MININT32, G_MAXINT32, 0,
|
|
|
|
|
G_PARAM_READABLE |
|
|
|
|
|
G_PARAM_STATIC_STRINGS);
|
2013-09-06 11:56:41 +02:00
|
|
|
obj_properties[PROP_WINS_SERVERS] =
|
2016-07-06 10:20:06 +02:00
|
|
|
g_param_spec_variant (NM_IP4_CONFIG_WINS_SERVERS, "", "",
|
|
|
|
|
G_VARIANT_TYPE ("au"),
|
|
|
|
|
NULL,
|
|
|
|
|
G_PARAM_READABLE |
|
|
|
|
|
G_PARAM_STATIC_STRINGS);
|
2013-09-06 11:56:41 +02:00
|
|
|
|
2016-01-19 16:45:55 +01:00
|
|
|
g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
|
2007-11-28 22:38:33 +00:00
|
|
|
|
2015-04-13 13:31:42 -04:00
|
|
|
nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (config_class),
|
2015-04-15 14:53:30 -04:00
|
|
|
NMDBUS_TYPE_IP4_CONFIG_SKELETON,
|
|
|
|
|
NULL);
|
2007-02-16 11:23:49 +00:00
|
|
|
}
|